一般来说,这两个示例代码段的处理速度是否存在显着差异,如果是这样,哪个应该更快完成?假设“processA(int)”和“processB(int)”是两个例子共有的空洞。
for(int x=0;x<1000;x++){
processA(x);
processB(x);
}
或
for(int x=0;x<1000;x++){
processA(x);
}
for(int x=0;x<1000;x++){
processB(x);
}
我正在考虑是否可以加快我的一个程序,它涉及多次循环数据块并以不同的方式处理它。因此,它为每种处理方法运行一个单独的循环,这意味着总共会运行很多循环,但每个循环的工作都很少。我正在考虑重写我的代码,以便每个循环都包含每个处理方法;换句话说,周期少得多,但每个周期的工作量都较大。
这将是对我的程序结构的非常密集的重写。所以,除非它能给我带来显着的性能提升,否则不值得这么麻烦。
答案 0 :(得分:2)
单循环案例将包含更少的指令,因此运行速度更快。
但是,除非processA
和processB
功能非常快,否则如此大量的重构会让您获得可忽略的性能提升。
如果这是生产代码,您也应该注意,因为可能有副作用。您应该在测试相关代码的单元测试框架的上下文中进行更改。 (在C ++中,例如x
可以通过引用传递,并且可以通过函数进行修改!当然Java没有这样的危险,但可能还有其他原因导致所有processA
函数必须在所有函数之前运行{ {1}}函数和程序注释可能无法明确说明。
答案 1 :(得分:2)
当然,融合2个循环会更快。 (有些编译器会自动执行此操作作为优化。)速度快多少?这取决于循环运行的迭代次数。除非迭代次数非常高,否则您可以预期改进将是最小的。
答案 2 :(得分:2)
第一种情况比第二种情况略快,因为for循环本身对性能有影响。但是,您应该问自己的主要问题是:效果对我的计划有意义吗?如果没有,您应该选择清晰易读的代码。
在这种情况下要记住的一件事是JVM(Java虚拟机)进行了大量的优化,在您的情况下,JVM甚至可以摆脱for循环并将代码重写为1000次连续调用processA()和processB()。因此,即使你有两个for循环,JVM也可以摆脱它们,使你的程序比第一种情况更优化。
为了基本了解方法调用,成本和JVM,您可以阅读这篇简短的文章:
https://plumbr.eu/blog/how-expensive-is-a-method-call-in-java
答案 3 :(得分:1)
第一段代码更快,因为它只有一个for循环。
但是,如果你需要在processA()执行n次之后和processB()的循环开始之前做一些事情,那么第二个选项将是理想的。