还是在性能上一样?
例如,哪个更快?
int a = 1, b = 2;
for (int i = 0; i < 10; ++i) {
a = a + 1;
b = b + 1;
}
或
for (int i = 0; i < 10; ++i) {
a = a + 1;
}
for (int i = 0; i < 10; ++i) {
b = b + 1;
}
注意:我改变了例子,因为很多人似乎都挂在其中的陈述上,而不是问我问题的目的。
答案 0 :(得分:2)
您的两个示例根本不执行任何操作,大多数编译器会将它们优化为同一件事-完全不执行。
更新:您的两个新示例显然是等效的。如果有任何一个编译器生成的代码比另一个更好,则说明它是劣质的编译器,您应该只使用更好的编译器。
答案 1 :(得分:0)
正如人们指出的那样,无论我采用哪种方式,编译器都会进行优化,但这实际上取决于循环中包含哪些语句。
答案 2 :(得分:0)
性能取决于循环的内容。
让我们分解for
循环。 for
循环包括:
让我们将比较定义为比较指令(用于设置处理器状态位)和分支(以利用处理器状态位)。
处理器在执行数据指令时最幸福。处理器处理数据,然后处理管道(缓存)中的下一条指令。
处理器不喜欢2)比较和5)分支(循环的顶部)。分支意味着处理器已停止处理数据并执行逻辑以确定是否需要替换指令高速缓存。这段时间可用于处理数据指令。
优化for
循环的目的是减少分支。第二个是优化数据缓存/内存访问。常见的优化技术是循环展开,或者基本上是在for
循环内放置更多语句。作为一种度量,您可以占用for
循环的开销,然后除以循环内的语句数量。
根据上述信息,您的第一个循环(带有两个赋值语句)将更加高效,因为每个循环有更多的数据指令;总体开销较小。
编辑1:并行环境
但是,您的第二个示例可能会更快。编译器可以将两个循环设置为并行运行(通过指令或实际的并行任务)。由于两个循环是独立的,因此它们可以同时运行或在CPU内核之间拆分。处理器具有可以在多个内存位置执行通用操作的指令。您的第一个示例使此操作更加困难,因为它需要编译器进行更多分析。由于第二个示例中的循环更简单,因此编译器的分析也更简单。
此外,迭代次数也起一定作用。对于少量,回路应执行相同或可忽略的差异。对于大量的迭代,可能会存在一些时序差异。
摘要:概要文件。基准。唯一的真实答案取决于测量结果。它们可能会有所不同,具体取决于同时运行的应用程序,内存量(RAM和硬盘驱动器),CPU内核的数量和其他项目。系统上的配置文件和基准。在其他系统上重复。