为何求最大连续1个数的两段相似C++代码运行速度存在差异
两段代码耗时差异原因分析
首先需要明确:两段代码逻辑并不完全一致,code1是正确的「求数组最大连续1的个数」实现,code2实际实现的是求数组最大连续0的个数,二者对0和1的处理分支完全相反,这是耗时差异的核心前提。
code1运行速度更快的原因主要有两点:
1. 测试用例特征匹配code1的低开销路径
该题的主流测试用例普遍存在「0的占比更高、连续0的长度更长」的特征:
- code1只有遇到1的时候,才需要执行
count++和max两次操作;遇到0时仅需要执行一次count=0的赋值操作,运算开销极低 - code2刚好反过来,遇到0的时候就要执行
count++和max两次操作,遇到1才执行count=0。当测试用例中0占比更高时,code2高频执行开销更高的max操作,总执行指令数远多于code1。
2. 编译器优化收益更高
对于连续出现的0场景:
- code1中重复的
count=0属于无副作用的冗余操作(上一次赋值已经把count置为0,重复赋值不影响最终结果),编译器可以直接优化掉这部分冗余赋值,进一步减少实际执行的指令数 - code2中连续0对应的
count++和max操作都存在实际副作用,会改变变量的取值,编译器无法优化,必须逐次执行,耗时自然更高。
内容的提问来源于stack exchange,提问作者Rahul Ranjan
相关产品推荐
相关产品推荐

