对大量循环使用简单语句与 for 循环的性能改进

The performance improvements of using simple statements vs for loops for a large number of loops

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

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]); } }

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

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

两种情况都可以查看生成的字节码and/or如果觉得重要可以做一个benchmark

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

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

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 可能会进行一些优化,例如循环展开。

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

Premature optimization is the root of all evil! (Donald Knuth)