哪种处理两种重复操作的方式会更快完成?

时间:2014-06-10 12:40:29

标签: java performance for-loop

一般来说,这两个示例代码段的处理速度是否存在显着差异,如果是这样,哪个应该更快完成?假设“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);
}

我正在考虑是否可以加快我的一个程序,它涉及多次循环数据块并以不同的方式处理它。因此,它为每种处理方法运行一个单独的循环,这意味着总共会运行很多循环,但每个循环的工作都很少。我正在考虑重写我的代码,以便每个循环都包含每个处理方法;换句话说,周期少得多,但每个周期的工作量都较大。

这将是对我的程序结构的非常密集的重写。所以,除非它能给我带来显着的性能提升,否则不值得这么麻烦。

4 个答案:

答案 0 :(得分:2)

单循环案例将包含更少的指令,因此运行速度更快。

但是,除非processAprocessB功能非常快,否则如此大量的重构会让您获得可忽略的性能提升。

如果这是生产代码,您也应该注意,因为可能有副作用。您应该在测试相关代码的单元测试框架的上下文中进行更改。 (在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()的循环开始之前做一些事情,那么第二个选项将是理想的。

相关问题