读书人

帮忙测试下小弟我想踢微软

发布时间: 2012-03-19 22:03:04 作者: rapoo

帮忙测试下,我想踢微软
刚才讨论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 

读书人网 >C++

热点推荐