关于程序优化的问题,c/c++赋值数组快慢问题?
有个面试题:
步长为1给数组赋值和步长为4给数组赋值的操作。
前者耗时是不是后者的4倍。
for (int i = 0; i < n; i += 1) {
a[i] = 1;
}
for (int i = 0; i < n; i += 4) {
a[i] = 1;
}
应该从内存局部性和缺页命中这方面考虑吧。
我觉得这两种不同的赋值,都直接从内存去取数组,一般数组不大,一次就全部取来了,所以这两种操作的时间差距不应该有4倍那么大。
而具体赋值耗时之类的,我就有点疑惑了。
有没有大佬能说说。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你自己测试一下就知道了。这种问题有很多人问过、研究过的,StackOverflow 上应该有不少。
CPU 并不直接从内存取数据,它有缓存,而且是好几级。情况很复杂,比如还有指令和数据分开缓存的系统架构,还有多 CPU 的 NUMA 机器。CPU 的字长当然是会有影响的。
另一方面,编译器优化也会有影响。
还有个问题,你这里没有给出 a 的类型,而打上了 C++ 的标签。在 C++ 里,赋值操作可以是很复杂的。当然取下标操作也可以很复杂。
「一般数组不大」这个结论你是哪里来的……在现代PC上,我猜这两个代码的效率应该是差不多的。