【发布时间】:2017-08-10 09:10:53
【问题描述】:
所以,我在 C 库中的 C 程序中使用 qsort。它按预期工作,所以我决定使用比较器。
比较器 1(我用这个):
int compare (const void * a, const void * b)
{
if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;
else return 0;
}
比较器 2:
int comp (const void *a, const void *b)
{
const double *ia = (const double *)a; // casting pointer types
const double *ib = (const double *)b;
return *ia - *ib;
}
第一个按我的意愿工作。第二个应该和第一个一样。我想使用第二个,因为程序运行得更快一些,但它并没有真正对任何东西进行排序!
我很确定我在较小的阵列上使用了比较器 #2,并且它有效。除非我在那里遗漏了什么。
【问题讨论】:
-
我发现很难相信这个棘手的“优化”比较器即使在被纠正为实际工作时也会明显更快,除非在最具体的情况下。请记住,
qsort()函数通过指针调用比较器。其开销可能会主导这个简单函数的性能。 -
尝试用
double diff = *ia - *ib; return *(int*)((char*)&diff+4);替换return *ia - *ib;,看看它的性能如何。这是非常特定于实现的,不完整且不推荐,但应该适用于 sizeof(int) = 4 的 little-endian。它只返回diff的最重要的 32 位字,它应该设置符号位。还假设该字的位内容对于正差异不为零。
标签: c algorithm sorting pointers