帮忙测试下,我想踢微软
刚才讨论qsort比std::sort慢的原因,我列了原因,底下大家也找了原因,可是讽刺的是,我将VC提供的qsort.c实现直接拷贝过来后调用,qsort的速度直接赶上了std::sort……几乎一摸一样
微软的crt编译选项就算不公开,我想也不至于不优化吧,/O2至少的,为什么会如此呢?
大家有兴趣也跑跑看,第二步让你输保存地址时直接回车跳过即可。
http://download.csdn.net/source/2203180
测试一遍后,发现从VC6到VS08无不如此
得到一结论——VC的crt速度慢是微软有意的……
[解决办法]
找了 glibc 源码里的 qsort 实现,用时与机器上 glibc 的 qsort 相当一致。把 MS 的 qsort 实现移植过来测试,还要稍微慢那么一丁点,估计和平台有些关系。
如果把 qsort 实现和测试函数写在同一个文件里面,由于编译优化的关系,基本可以做到 std::sort 强制回调的速度,但和直接用 operator < 的 std::sort 还是没得比。
[解决办法]
顺便问一下,你用的随机发生器可靠么?
我在 VS2008/Win7 下面,换了我自己的数据,结果时间慢了一个数量级还多……
你的数据是多少?我用我的数据排序 100M 至少要四秒多,用你的数据 0.2 秒就收工了。
- C/C++ code
outfile = fopen(filename,"wb");#if 1 HANDLE hFile = CreateFile("D:\\sort\\input", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) abort(); DWORD count = 0; ReadFile(hFile, array, top, &count, 0); if(count != top) abort();#endif QueryPerformanceCounter(&begintime); std::sort(&array[0],&array[top]); QueryPerformanceCounter(&endtime);
[解决办法]
经过一系列测试,觉得还是内联 cmp 函数对性能的影响更大。
- C/C++ code
crt: VC CRT qsortstl: STL sortsrc: MS 公布的 qsortgl/nogl: 开/关“链接时间代码生成”(默认打开)inline/noinline: 内联/不内联(即 /Ob1 和 /Ob2)crt stl src src/nogl7.750 4.781 5.129 7.584src/noinline src/noinline/nogl src/nogl/inlineswap7.441 7.759 7.577src/gl/inlineswap src/gl/inlinecmp src/gl/inlinecmp/inlineswap7.496 5.102 5.134