【问题标题】:Which manner of processing two repetative operations will be completed faster?哪种方式处理两次重复操作会更快完成?
【发布时间】:2014-06-10 12:40:29
【问题描述】:

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

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

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

【问题讨论】:

  • 可以肯定的是,第一个(同时运行的单个循环)会更快(假设 A、B 是独立的,并且代码是连续的,没有我们中间缺少的东西)。这只是通过计算操作,因为在一个循环中,您可以保存 1000 次对 ++ 的调用。除此之外,我不知道有什么区别。
  • 您还可以保存 1000 次 x 到 1000 的比较。
  • @BrettOkken @Elayeek 我很确定 x 的 1000 次比较(以及对 ++ 的 1000 次调用)已被编译器/JVM 解决(尤其是因为 1000 是硬编码的)所以第一个示例对第二个示例的改进充其量是微不足道的。
  • @Ceiling Gecko 我只是指出,虽然 Elayeek 只提到了对 ++x 的调用,但也有 x 与 1000 的比较。我同意性能可能几乎没有差异,尤其是在执行时足以优化。

标签: java performance for-loop


【解决方案1】:

第一种情况会比第二种情况稍微快一些,因为 for 循环本身会影响性能。但是,您应该问自己的主要问题是:效果对我的程序是否重要?如果没有,您应该选择清晰易读的代码。

在这种情况下要记住的一件事是 JVM(Java 虚拟机)进行了大量优化,在您的情况下,JVM 甚至可以摆脱 for 循环并将代码重写为 1000 次连续调用到 processA() 和 processB()。因此,即使您有两个 for 循环,JVM 也可以摆脱这两个循环,从而使您的程序甚至比您的第一个情况更加优化。

要基本了解方法调用、成本和 JVM,您可以阅读这篇短文:

https://plumbr.eu/blog/how-expensive-is-a-method-call-in-java

【讨论】:

    【解决方案2】:

    当然,融合 2 个循环会更快。 (一些编译器会自动执行此操作作为优化。)快多少?这取决于循环运行的迭代次数。除非迭代次数非常很高,否则您可以预期改进将是最小的。

    【讨论】:

      【解决方案3】:

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

      但是,除非 processAprocessB 是非常快速的函数,否则如此大幅度的重构只会给您带来微不足道的性能提升。

      如果这是生产代码,您还应该小心,因为可能会有副作用。您应该在测试相关代码的单元测试框架的上下文中进行更改。 (例如在 C++ 中,x 可以通过引用传递,并且可以由函数修改!当然 Java 没有这种危险,但可能还有其他原因导致所有 processA 函数必须在所有 processB 函数之前运行,并且程序 cmets 可能没有说清楚)。

      【讨论】:

        【解决方案4】:

        第一段代码更快,因为它只有一个 for 循环。

        但是,如果您需要在 processA() 执行 n 次之后且在 processB() 的循环开始之前执行某些操作,那么第二个选项将是理想的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-11
          • 2012-02-12
          • 2023-03-17
          相关资源
          最近更新 更多