我uint64_t使用来自.RAW文件的RGB数据排序超过1000万s,花费了79%的C程序时间qsort.我正在寻找这种特定数据类型的更快排序.
作为RAW图形数据,数字是非常随机的,并且~80%是唯一的.不需要对排序数据进行部分排序或运行.4 uint16_tS的内部的uint64_t是R,G,B和零(可能是一个小计数<=〜20).
我有最简单的比较函数,我可以想到使用unsigned long longs(你不能只是减去它们):
qsort(hpidx, num_pix, sizeof(uint64_t), comp_uint64);
...
int comp_uint64(const void *a, const void *b) {
if(*((uint64_t *)a) > *((uint64_t *)b)) return(+1);
if(*((uint64_t *)a) < *((uint64_t *)b)) return(-1);
return(0);
} // End Comp_uint64().
Run Code Online (Sandbox Code Playgroud)
StackExchange上有一个非常有趣的"编程拼图和代码高尔夫",但他们使用了floats.然后有QSort,RecQuick,堆,stooge,树,基数......
swenson/sort看起来很有趣,但对我的数据类型没有(明显的)支持uint64_t.而"快速排序"时间是最好的.有些消息称,系统qsort可以是任何东西,不一定是"快速排序".
C++排序绕过了void指针的通用转换,并实现了对C的性能的巨大改进.必须有一种优化的方法,以经线速度通过64位处理器猛击U8.
系统/编译器信息:
我目前正在使用GCC和Strawberry Perl
gcc version 4.9.2 (x86_64-posix-sjlj, built by strawberryperl.com
Intel 2700K Sandy Bridge CPU, 32GB DDR3
windows 7/64 pro
gcc -D__USE_MINGW_ANSI_STDIO -O4 -ffast-math -m64 -Ofast …Run Code Online (Sandbox Code Playgroud)