0

我编写了一个对大量数据进行排序的函数。为了测试它的性能,我将它与qsort. 如果我在运行带有 GCC 4.2.2 的 FreeBSD 的桌面上编译它,结果是qsort比我的函数花费的时间更少。但是,我在使用 GCC 4.1.2 运行 RedHat 的服务器上编译它,结果是我的函数花费的时间比qsort.

我对我的功能是否更好感到困惑qsort。有人可以帮我解释一下这种奇怪的情况吗?

我已经使用相同的 CFLAGS 对其进行了很多次测试,在同一台机器上运行它,并且在所有其他相同的条件下运行,除了不同的功能。

我的代码:

 53 int
 54 main(void)
 55 {
 56     int * array_first, * array_next;
 57     int len = 1000000;
 58     int i;
 59     struct timeval start, duration;
 60 
 61 
 62 
 63     array_first = malloc(sizeof(int) * len);
 64     array_next = malloc(sizeof(int) * len);
 65 
 66 
 67     for(i = 0; i < len; i++){
 68         *(array_first + i) = rand() % 1000;
 69         *(array_next + i) = *(array_first + i);
 70     }
 71 
 72     set_starttime(&start);
 73     quicksort(array_first, len, sizeof(int), compar);
 74     get_runningtime(start, &duration);
 75     printf("%lu\n", duration.tv_sec * MICRO_PER_SEC + duration.tv_usec);
 76     set_starttime(&start);
 77     qsort(array_next, len, sizeof(int), compar);
 78     get_runningtime(start, &duration);
 79     printf("%lu\n", duration.tv_sec * MICRO_PER_SEC + duration.tv_usec);
 80 
 81     assert(memcmp(array_first, array_next, sizeof(int) * len) == 0);
 82 
 83     free(array_first);
 84     free(array_next);
 85 
 86     return 0;
 87 }
 88 
4

3 回答 3

1

表现不同的原因可能有很多。

  • 两个系统中的实现qsort可能不同,一个恰好更适合您的测试用例
  • 如果测试用例是随机生成的,那么您可能只是在一个测试用例上不走运
  • 使用不同的编译器版本编译代码,意味着进行了不同的优化,从而改变了代码的性能
  • 在不同的系统上运行测试意味着在相同的代码中会有不同的性能。在具有特定测试用例的一种架构上,缓存可能会被轻微滥用,而在具有更大缓存的另一种架构上,这不是问题。

我可以想到一万个其他原因,但这应该足以让你知道你不应该尝试进行这样的比较。

于 2012-07-04T12:21:16.140 回答
0

如果您的 compar() 函数可以内联(静态函数可以内联),那将是一个巨大的胜利。内联的数量很大程度上取决于编译器和标志。

对于 qsort(),不能使用内联:qsort 依赖于回调函数是一个真正的函数。通常,比较函数会在配置文件中显示占用 xx% 的 CPU,即使对于廉价的比较函数(当调用开销相对较大时)也是如此。(你有简介吗?)

于 2012-07-04T12:55:53.493 回答
0

我假设您确保在两台计算机上使用相同的数据,并确保同时运行的其他程序不会影响您的测试结果。

首先,您可以查看生成的汇编代码,并检查两个编译器版本是否生成相同的输出。

如果是这样,差异可能是由于两台计算机的硬件架构不同,主要是 CPU 及其缓存。

如果在具有大型 L2/L3 缓存的 CPU 上运行,一种实现可能会更快,但如果可用空间较少,则速度会慢得多。

于 2012-07-04T12:18:23.950 回答