1

ボックス化された double 変数がfooあり、その値を で乗算し2て、別のボックス化された double 変数 に格納するとしますbar。以下のアプローチから、

アプローチ 1:

Double bar = foo * 2;

と、

アプローチ 2:

Double bar = Double.valueOf(foo.doubleValue() * 2);

効率や読みやすさなどを考慮すると、どちらがより好ましいですか? それとも、これらのアプローチが実質的に同等であるほど些細な違いですか?

4

3 に答える 3

6

アプローチする方が良いです。

  • 人間が読める
  • 他のすべてが等しい場合、文字数が少ないほど文字数が多いよりも優れています
  • コンパイラは、おそらくパフォーマンスの違いを取り除きます。
于 2013-01-11T16:33:54.940 に答える
4

最初の1つ。読みやすさが向上し、すべてのボックス化/ボックス化解除操作が舞台裏に保持されます。

2 を掛けるなどの単純な演算の効率について考えないでください。

...または長い答え

次の 2 つの方法があります。

void method1() {
    Double foo = 1.0;
    Double bar = foo * 2;
}

void method2() {
    Double foo = 1.0;
    Double bar = Double.valueOf(foo.doubleValue() * 2);
}

でコンパイルしjavac、バイトコード命令を調べますjavap

void method1();
   Code:
      0: dconst_1
      1: invokestatic  #2                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
      4: astore_1
      5: aload_1
      6: invokevirtual #3                  // Method java/lang/Double.doubleValue:()D
      9: ldc2_w        #4                  // double 2.0d
     12: dmul
     13: invokestatic  #2                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     16: astore_2
     17: return

 void method2();
   Code:
      0: dconst_1
      1: invokestatic  #2                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
      4: astore_1
      5: aload_1
      6: invokevirtual #3                  // Method java/lang/Double.doubleValue:()D
      9: ldc2_w        #4                  // double 2.0d
     12: dmul
     13: invokestatic  #2                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
     16: astore_2
     17: return

違いがわかりますか?

于 2013-01-11T16:33:46.270 に答える
4

どのように最適化しようとしても、JavaはこのバージョンDouble bar = foo * 2;を少なくともソリューションと同じくらい最適化すると思います。そのようなパフォーマンスを得ようとしても、通常は無駄です。

于 2013-01-11T16:33:15.517 に答える