我最近开始考虑优化,现在我知道有很多书籍和文章,但我有一个我感兴趣的特定场景。
一个。
for (i = 0; i < limit + 5; i++)
cout << test;
乙
limit2 = limit +5;
for (i = 0; i < limit2; i++)
cout << test;
我想知道的是第二段代码是否会运行得更快,因为它只需要进行一次数学计算,或者是在循环的生命周期内存储的计算。
答案 0 :(得分:11)
假设类型很简单,如int
等,如果任何体面的编译器没有在发布版本中将两个示例优化为相同的代码,我会感到非常惊讶。例如,复杂类型可能需要在重载operator++
中需要更多的马力。
答案 1 :(得分:5)
完全没有区别。
你不应该在这里打扰,因为cout << test
无论如何都会使用99%的时间。
您可以对代码执行几乎所有简单的转换,编译器也可以执行。还有一些!
相信你的编译器(tm)!
答案 2 :(得分:5)
在这两种情况下,您的编译器可能会生成相同的机器级指令。不要打扰。
答案 3 :(得分:4)
B更快。 但是,它取决于编译器和优化级别。启用了优化的智能编译器将A替换为B.
答案 4 :(得分:3)
我认为它没有区别,因为在常数折叠/常量传播(编译器的典型优化技术)之后,limit + 5
(A)和limit2
(B)在for中-loop将替换为常量值(提供的限制可以解析为常量值)。
所以运行时应该是相同的,但编译时对A来说可能稍微快一点,因为B需要更多的常量传播/常数折叠迭代。但这只是挑剔,应该是不明显的(除非你在Zuse Z1编译)
答案 5 :(得分:3)
无论编译方式如何,您都专注于几乎无关紧要的优化。专注于为其余代码选择正确的算法和设计。通过配置文件了解什么是缓慢的并优化占用时间最多的区域。通常,10%的代码占用90%的时间。您目前正在考虑90%代码中的一小部分,除了有一个空循环块之外,在几乎所有可能的情况下,所占用的时间远远少于10%。
答案 6 :(得分:3)
我的回答是:
这取决于i
和limit
的类型,因为问题中没有提到它们的类型(截至目前)。
如果它们是内置类型(例如int
,short
,long
,char
等),则不会有太多内容对于所有实际目的而言,差异并非至少明显不同。这也是因为大多数CPU周期仅由cout
消耗。智能编译器会优化A
(以及可能B
),为两者发出相同的代码。
如果它们是某些用户定义的类型,并且i
的类型已超载operator<
且operator++
且类型limit
已超载{{1那么这一切都取决于如何定义所有这些函数(代码中涉及的运算符重载)。但是,operator+
更有可能更快,因为scenario B
将被计算一次。
注意:在第二种情况下,表达式limit2 = limit +5;
涉及函数调用,基本上是这样的:
limit2 = limit +5
场景B 如果它停留在 limit2 = limit.operator+(5);
循环之外,则避免重复此函数调用。
答案 7 :(得分:2)
使用比 cout 更“原子”的东西测试,并且循环次数更多。无论如何,这些源应该生成完全相同的代码。
答案 8 :(得分:0)
可能没有区别。
第二个循环更快的一个可能原因是编译器是否能够推断“limit2”没有在任何地方获取它的地址,但无法推断出“限制”。如果限制具有在程序中的任何地方采取的地址,那么运营商可能&lt;&lt;您调用的函数可以通过该指针更改限制,因此每次循环时都必须重新加载并重新计算表达式。然而,如果将限制+5复制到局部变量中,编译器就会知道合法程序无法更改它。