【问题标题】:The performance improvements of using simple statements vs for loops for a large number of loops对大量循环使用简单语句与 for 循环的性能改进
【发布时间】:2015-01-01 13:15:23
【问题描述】:

我正在创建一个程序来模拟多代的简单遗传杂交,并且有一种方法可以接收两个creature 类,然后通过它们的类中的方法获取它们的两个配子。这四个配子存储在arraygamete[] 中。然后将这些配子用作arguments 以创建四个新的creature 类。在这里,有两种可能的方法(offSpring[]arraycreatures 类:

offSpring[0] = new MonoCreature(gamete[0], gamete[2]); offSpring[1] = new MonoCreature(gamete[0], gamete[3]); offSpring[2] = new MonoCreature(gamete[1], gamete[2]); offSpring[3] = new MonoCreature(gamete[1], gamete[3]);

for(int q = 0; q < 4; q++) { if((q == 0)||(q == 1)) { offSpring[q] = new MonoCreature(gamete[0], gamete[q + 2]); } else if((q == 2)||(q == 3)) { offSpring[q] = new MonoCreature(gamete[1], gamete[q]); } }

这个方法必须重复调用数百次,甚至数千次才能运行一次。因此,性能成为一个重要问题。因此我倾向于追求第一部分,但我的老师说第二部分是一种更干净的方式。他明白第二个会有性能损失,但还是坚持了下来。在您看来,哪一个更好?

【问题讨论】:

  • 对我来说,第一个更容易阅读和理解,而第二个远非“干净”。

标签: java performance for-loop


【解决方案1】:

我真的很喜欢您的第一种方法 - 不是因为性能,而是因为简单性和可读性。它比第二种方法更容易理解(在我看来这真的很肮脏)。

如果您(或您的老师)真的坚持使用基于循环的版本,我建议采用以下方法:

static final int ALLELES = 2; // or however it is called... ;)

int q = 0;
for (int first = 0; first < ALLELES; first++) {
    for (int second = ALLELES; second < 2 * ALLELES; second++) {
        offSpring[q++] = new MonoCreature(gamete[first], gamete[second]);
    }
}

性能影响可能没有您想象的那么大,因为 JVM 可能会进行一些优化,例如循环展开。

如果性能真的很重要,您应该先做一些基准测试!

过早的优化是万恶之源! (唐纳德·克努斯)

【讨论】:

  • 不错的答案,但是,我无法理解offSpring[q++] 会做什么。我相信 sn-p 属于我的问题的 for(int q... 循环。 offSpring[] 数组的最大长度为 4,所以我的 q 不能大于/等于 4。我想 offSpring[q] 在这里对我来说会更好。无论如何,谢谢你的回答,会努力说服我的老师。
  • 我忘记声明 q。解决它。 sn-p 是 for 循环的替代品。
【解决方案2】:

编译器很可能有循环展开优化(Wikipedia),所以如果没有循环更快,编译器会相应地更改生成的字节码。

您可以在这两种情况下检查生成的字节码和/或如果您认为这很重要,您可以进行基准测试。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2021-10-01
    相关资源
    最近更新 更多