#include <iostream>#include <cstring>#include <sys/time.h>static inline long double currentTime(){ timespec ts; clock_gettime(CLOCK_MONOTONIC,&ts); return ts.tv_sec+(long double)(ts.tv_nsec)*1e-9;}int main(){ size_t W=20000,H=10000; float* data1=new float[W*H]; float* data2=new float[W*H]; memset(data1,W*H*sizeof(float)); memset(data2,W*H*sizeof(float)); long double time1=currentTime(); for(int q=0;q<16;++q) // take more time for(int k=0;k<W*H;++k) data2[k]=data1[k]; long double time2=currentTime(); std::cout << (time2-time1)*1e+3 << " ms\n"; delete[] data1; delete[] data2;}
我用g 4.8.1命令g main.cpp -o test -std = c 0x -O3 -lrt编译了这个.这个程序为我打印6952.17毫秒. (我不得不设置ulimit -s 2000000,以免崩溃.)
我还尝试使用新的自动VLA更改数组的创建,删除memset,但这不会改变g行为(除了更改时间几次).
似乎编译器可以证明这段代码不会做任何合理的事情,那么为什么不优化循环呢?
解决方法 无论如何,这不是不可能的(铿锵3.3版):clang++ main.cpp -o test -std=c++0x -O3 -lrt
该程序为我打印0.000367毫秒……并查看汇编语言:
...callq clock_gettimemovq 56(%rsp),%r14movq 64(%rsp),%rbxleaq 56(%rsp),%rsimovl ,%edicallq clock_gettime...
而对于g:
...call clock_gettimefildq 32(%rsp)movl ,%eaxfildq 40(%rsp)fmull .LC0(%rip)faddp %st,%st(1).p2align 4,10.p2align 3.L2: movl ,%ecx xorl %edx,%edx jmp .L5 .p2align 4,10 .p2align 3 .L3: movq %rcx,%rdx movq %rsi,%rcx .L5: leaq 1(%rcx),%rsi movss 0(%rbp,%rdx,4),%xmm0 movss %xmm0,(%rbx,4) cmpq 0000001,%rsi jne .L3 subl ,%eax jne .L2 fstpt 16(%rsp) leaq 32(%rsp),%rsi movl ,%edi call clock_gettime ...
编辑(g v4.8.2 / clang v3.3)
消息代码 – 原始版本(1)
...size_t W=20000,H=10000;float* data1=new float[W*H];float* data2=new float[W*H];...
来源代码 – 修改版(2)
...const size_t W=20000;const size_t H=10000;float data1[W*H];float data2[W*H];...
现在未优化的情况是(1)g
总结以上是内存溢出为你收集整理的c – 为什么这个无 *** 作循环没有被优化掉?全部内容,希望文章能够帮你解决c – 为什么这个无 *** 作循环没有被优化掉?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)