Сегодня я столкнулся с необычным поведением с BigDecimal. В простом слове, существует значительная разница между следующими двумя кусками кода пытается сделать то же самоеJava BigDecimal странное поведение производительности
int hash = foo();
BigDecimal number = new BigDecimal(hash);
против
BigDecimal number = new BigDecimal(foo());
, чтобы доказать это, я ниже класс, чтобы показать разница. Мой java - 1.7.0_75-b13, 64 бит, mac. В моей среде первый цикл занял 2 секунды, второй цикл занял 5 секунд.
import java.math.BigDecimal;
public class Crazy {
public static void main(String[] args) {
new Crazy().run();
}
void run() {
// init
long count = 1000000000l;
// start test 1
long start = System.currentTimeMillis();
long sum = 0;
for (long i=0; i<count; i++) {
sum = add(sum);
}
long end = System.currentTimeMillis();
System.out.println(end - start);
// start test 2
long start2 = end;
sum = 0;
for (long i=0; i<count; i++) {
sum = add1(sum);
}
long end2 = System.currentTimeMillis();
System.out.println(end2 - start2);
}
long add(long sum) {
int hash = hashCode();
BigDecimal number = new BigDecimal(hash);
sum += number.longValue();
return sum;
}
long add1(long sum) {
BigDecimal number = new BigDecimal(hashCode());
sum += number.longValue();
return sum;
}
}
выход javap
long add(long);
Code:
0: aload_0
1: invokevirtual #56 // Method java/lang/Object.hashCode:()I
4: istore_3
5: new #60 // class java/math/BigDecimal
8: dup
9: iload_3
10: invokespecial #62 // Method java/math/BigDecimal."<init>":(I)V
13: astore 4
15: lload_1
16: aload 4
18: invokevirtual #65 // Method java/math/BigDecimal.longValue:()J
21: ladd
22: lstore_1
23: lload_1
24: lreturn
long add1(long);
Code:
0: new #60 // class java/math/BigDecimal
3: dup
4: aload_0
5: invokevirtual #56 // Method java/lang/Object.hashCode:()I
8: invokespecial #62 // Method java/math/BigDecimal."<init>":(I)V
11: astore_3
12: lload_1
13: aload_3
14: invokevirtual #65 // Method java/math/BigDecimal.longValue:()J
17: ladd
18: lstore_1
19: lload_1
20: lreturn
Звучит как какой-то эффект «микро-бенчмарка» для меня, обе формы эквивалентны –
Попробуйте изменить порядок 'add()' и 'add1()' в коде и посмотреть, что произойдет? – ntalbs
Пожалуйста, разместите выход javap для двух подходов. –