You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同作用域同类型变量执行相同操作耗时差异的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:52:52