gpt4 book ai didi

c++ - 循环比一个一个遍历更快

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:19 25 4
gpt4 key购买 nike

让我们考虑使用 C++ 打印前 10 个正整数的以下代码片段:

for (int i = 1; i<11;i++)

{

cout<< i ;

}

这比按如下顺序逐个打印每个整数更快还是更慢:

x =1;

cout<< x;

x++;

cout<< x;

等等..

为什么它应该更快或更慢有什么原因吗?它是否因一种语言而异?

最佳答案

这个问题类似于this one ;我复制了 my answer to that question 的摘录下面...(数字不同;11 vs. 50;分析相同)

您正在考虑做的是一种手动形式的循环展开。循环展开是一种优化,编译器有时会使用它来减少循环中涉及的开销。只有在编译时可以知道循环的迭代次数(即迭代次数是一个常数,即使该常数涉及基于其他常数的计算),编译器才能做到这一点。在某些情况下,编译器可能会确定展开循环是值得的,但通常不会将其完全展开。例如,在您的示例中,编译器可能会确定将循环从 50 次迭代展开到只有 10 次迭代和 5 个循环体拷贝将具有速度优势。循环变量仍然存在,但不再对循环计数器进行 50 次比较,现在代码只需要进行 10 次比较。这是一个权衡,因为循环体的 5 个拷贝占用了缓存中 5 倍的空间,这意味着加载相同指令的那些额外拷贝会强制缓存驱逐(丢弃)已经存在的许多指令缓存以及您可能希望保留在缓存中的内容。此外,在循环根本没有展开的情况下,从主内存加载循环体指令的这 4 个额外拷贝比简单地从缓存中获取已加载的指令要花费更长的时间。

所以总而言之,只使用循环体的一个拷贝并继续并保留循环逻辑通常更有利。 (即根本不要展开任何循环。)

关于c++ - 循环比一个一个遍历更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42336307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com