对大量循环使用简单语句与 for 循环的性能改进
The performance improvements of using simple statements vs for loops for a large number of loops
我正在创建一个程序来模拟多代的简单遗传杂交,并且有一种方法接受两个 creature
类,然后通过它们类中的一个方法获得它们的两个配子。这四个配子存储在array
、gamete[]
中。然后这些配子被用作创建四个新的 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)
我正在创建一个程序来模拟多代的简单遗传杂交,并且有一种方法接受两个 creature
类,然后通过它们类中的一个方法获得它们的两个配子。这四个配子存储在array
、gamete[]
中。然后这些配子被用作创建四个新的 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)