同作用域同类型变量执行相同操作耗时差异的C代码疑问
为何连续操作同一变量的循环耗时翻倍?
我曾见过类似问题,但均与*缓存缺失(cache misses)或代码重排(code reordering)*相关,而我的情况并非如此。
代码非常简单:
#include <stdio.h> #include <time.h> void main() { unsigned char a, b; int i; clock_t before = clock(); for (i = 0; i < 10000000; i++) { a *= 2; b *= 2; } printf("elapsed: %lu\n", clock() - before); before = clock(); for (i = 0; i < 10000000; i++) { a *= 2; a *= 2; } printf("elapsed: %lu\n", clock() - before); }
代码中有两个变量a和b,第一个循环分别对a和b执行操作,第二个循环仅对a执行两次相同操作(换成b结果一致)。实际运行中第二个循环耗时约为第一个的两倍。
对应的汇编代码如下:
第一个循环中a *= 2和b *= 2的汇编:
sal BYTE PTR -1[rbp] sal BYTE PTR -2[rbp]
第二个循环的汇编:
sal BYTE PTR -2[rbp] sal BYTE PTR -2[rbp]
可见操作数量、类型、内存访问方式均一致,不存在缓存缺失,唯一区别是操作的内存地址(-1[rbp]与-2[rbp])不同。
为何第二个循环耗时翻倍?我猜测这与连续操作同一变量有关:第一次操作需完成后,第二次才能访问该变量;而第一个循环中两个操作对象不同,相互独立无需等待,这是否与CPU层面的微并行性有关?
内容的提问来源于stack exchange,提问作者Andrei Nikolaenko
相关产品推荐
相关产品推荐

