为什么LeetCode322中<=numeric_limits<int>::max()比<运算更快?
差异原因分析
你观察到的12ms运行时间差异主要来自两个可能的原因:
1. 编译器优化差异
在这道题的输入约束下,i的取值范围是0到题目给定的amount(LeetCode平台本题amount上限为104),`coins`数组中的面额都是正整数,最大值不会超过104。因此i + coin的最大值远小于numeric_limits<int>::max()(32位int下为2^31-1≈2e9),所以第一个判断条件逻辑上是恒成立的。
当使用<=判断时,编译器更容易识别到该条件的冗余性,可以直接在编译阶段优化掉这个多余的分支判断,减少每次循环的指令执行量。而<判断的语义对应的推导逻辑更复杂,部分编译器版本可能没有做对应的优化,导致每次循环都会多执行一次无意义的比较操作,累计下来就产生了12ms的耗时差距。
2. 判题环境波动
LeetCode的判题机本身存在±10ms左右的运行时间统计误差,你可以多次提交两份代码验证差异是否稳定存在。如果多次提交后差异消失或者波动很大,说明这12ms的差距大部分来自平台的统计误差。
另外你可以直接删掉第一个溢出判断条件,因为本题输入下不可能触发溢出,删除后代码运行速度会更快。
内容的提问来源于stack exchange,提问作者Shipley Xie
相关产品推荐
相关产品推荐

