Codeforces C++题解:单/双循环实现数组输入求和哪种速度更快?
结论
第二种单循环实现方案运行速度更快,在Codeforces评测环境下是该需求的更优选择。
性能差异原因
- 不存在I/O与计算切换的额外损耗
C++标准输入流cin默认自带用户态缓冲区,读取操作是批量触发系统调用完成的,单条整数加法操作的耗时仅为纳秒级,远低于I/O操作的耗时,二者穿插执行完全不会产生额外的切换开销,你担心的频繁切换损耗在这个场景下不存在。 - 缓存命中率更高
单循环方案中,刚读取写入数组的元素还存放在CPU高速缓存中,直接读取累加的缓存命中率为100%;双循环方案需要等全部元素读取完成后再遍历数组求和,当数组规模较大时,部分先写入的元素可能已经被挤出高速缓存,需要重新从内存读取,会产生额外的内存访问开销。 - 循环开销更低
双循环方案需要执行两次总次数为n的循环,多产生了n次循环变量自增、边界判断的开销,虽然单次开销极低,但当n规模达到数万以上时,累积开销也会被放大。
Codeforces环境额外优化建议
不管使用哪种方案,都建议在代码开头添加如下两行关闭cin的同步限制,能大幅提升输入读取速度:
ios::sync_with_stdio(false); cin.tie(nullptr);
内容的提问来源于stack exchange,提问作者Bimal Parajuli
相关产品推荐
相关产品推荐

