C:指向函数的指针,该函数返回指向整数的指针

时间:2020-09-10 11:44:42

标签: c algorithm timer

我正在尝试编写评估搜索算法运行时间的代码,并且我怀疑如何正确执行搜索。我想将函数linear_search传递给函数code_timer,并且code_timer函数应该评估线性搜索函数的执行时间。为了解决此问题,我正在尝试使用指向函数的指针。

// Search Algorithm function prototype
int *linear_search(int arr[], int arr_size, int val);

// Code timing function that evaluates the performance of the algorithm function
double code_timer( int *arr, int arr_size, int val, int nrun,
        int* (*search_algorithm)(int *arr, int arr_size, int val) )
{
    double interval = 0;
    clock_t start, end;
    int *ptr = NULL;

    start = clock();
    /* Code under Test */
    for (int j = 0; j < nrun; j++) {
        ptr = (*search_algorithm)(arr, arr_size, val);
    }
    /* End of Code under Test */
    end = clock();
    interval = (double)(end - start) / (double)(nrun) / (double) CLOCKS_PER_SEC * 1000000.0;
    return interval; // in microseconds (mcs)
}

最后,我需要使用linear_search函数作为参数来调用code_timer函数。

#define SIZE 100000 //size of data array
#define NRUN 100 // number of runs

int main(void) {
    ...
    // calling code_timer with a function linear_search as a parameter
    linear_result = code_timer(benchmark_data, SIZE, check_point, NRUN, linear_search);
}

我想知道我是否做得正确,如果没有,请告知我可以做到的方式。谢谢!

更新:我主要关心的是指向函数的指针:

  1. 我是否正确地将其声明为参数?
double code_timer( int *arr, int arr_size, int val, int nrun,
        int* (*search_algorithm)(int *arr, int arr_size, int val) );
  1. 我在code_timer和主要函数中正确取消引用了吗?
// this is from code_timer function
    for (int j = 0; j < nrun; j++) {
        ptr = (*search_algorithm)(arr, arr_size, val);
    }
// this is from main function
    linear_result = code_timer(benchmark_data, SIZE, check_point, NRUN, linear_search);

1 个答案:

答案 0 :(得分:2)

不,这没有正确完成。一个明显的问题是,基准测试代码中间不能包含printf或任何其他I / O。这将成为主要瓶颈,在循环的每一圈抓住所有执行时间。因此,此代码只是基准测试printf的性能+最重要的一点。

另外,for循环之外的printf("Found value: %d\n", *ptr);很奇怪,肯定是个错误吗?

这应该改为:

  • 开始计时
  • 循环运行n次函数。
  • 将结果存储在预先分配的数组中。
  • 停止计时。
  • 打印算法结果。
  • 打印基准测试结果。

最好使用static数组,因为动态内存访问会导致OS延迟分配,这意味着OS可能会在您第一次实际访问数据时而不是在{{ 1}}呼叫已找到。这将完全破坏基准测试。