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

LeetCode一维数组动态和:i=0起始循环为何比i=1更快

一维数组动态和反常性能差异原因

LeetCode单次提交显示的击败比例不具备严格的性能参考价值,你观察到的差异和代码逻辑的理论效率无关,核心原因如下:

  • 判题环境的负载波动影响
    LeetCode的运行时统计受宿主机CPU占用、测试用例调度顺序、内存分配抖动影响极大,同一份完全相同的代码连续提交,击败比例上下浮动40%属于常态,单次结果不能作为代码性能高低的判定依据。
  • 编译器优化抹平了逻辑层面的开销差异
    在O2优化级别下,带i>0判断的版本会被编译器直接做循环拆分优化:i=0的空分支被单独剥离,剩余循环直接从i=1开始执行,最终生成的汇编指令和你写的无判断版本几乎完全一致,不存在“多一次迭代、多一次分支判断”的额外开销。部分GCC版本下,从0开始计数的循环更容易被识别为标准计数循环,直接消除循环边界的溢出检查,生成的指令反而更精简。
  • CPU缓存与代码对齐的偶发影响
    两份代码编译后的机器码长度有微小差别,如果无判断版本的循环入口刚好落在CPU指令缓存行的跨边界位置,执行时会额外产生一次缓存行读取开销,在数组长度较短的测试用例下,这个固定开销会被放大,直接拉低统计到的运行时长;带判断版本的循环入口如果刚好对齐到缓存行起始地址,就会在统计结果上表现出明显的速度优势。

两个提交版本的代码

带i>0判断版本(统计显示击败78.36%提交)

class Solution
{
public:
    vector<int> runningSum(vector<int> & nums) {
        for (int i = 0; i < nums.size(); i++)
        {
            if (i > 0) {
                nums[i] += nums[i - 1];    
            }          
        }
        return nums;
    }
};

从i=1起始无判断版本(统计显示击败32.09%提交)

class Solution
{
public:
    vector<int> runningSum(vector<int> & nums) {
        for (int i = 1; i < nums.size(); i++)
        {
                nums[i] += nums[i - 1];    
        }
        return nums;
    }
};

你可以将两份代码各连续提交10次统计平均结果,会发现二者实际运行效率没有显著差异,单次结果的反差完全是环境偶发因素导致的,不存在“逻辑更优的代码实际更慢”的本质问题。

内容的提问来源于stack exchange,提问作者ZooPanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:39:15