java for loops を使用していくつかの実行時テストを行い、奇妙な動作を認識しました。私のコードでは、io と出力パラメーターをシミュレートするために、int、double などのプリミティブ型のラッパー オブジェクトが必要ですが、それは重要ではありません。私のコードを見てください。フィールド アクセスを持つオブジェクトは、プリミティブ型よりもどのように高速化できますか?
for
プリミティブ型のループ:
public static void main(String[] args) {
double max = 1000;
for (int j = 1; j < 8; j++) {
double i;
max = max * 10;
long start = System.nanoTime();
for (i = 0; i < max; i++) {
}
long end = System.nanoTime();
long microseconds = (end - start) / 1000;
System.out.println("MicroTime primitive(max: ="+max + "): " + microseconds);
}
}
結果:
MicroTime プリミティブ (最大: =10000.0): 110
MicroTime プリミティブ (最大: =100000.0): 1081
MicroTime プリミティブ (最大: =1000000.0): 2450
MicroTime プリミティブ (最大: =1.0E7): 28248
MicroTime プリミティブ (最大: =1.0E8) : 276205
MicroTime プリミティブ (最大: =1.0E9): 2729824
MicroTime プリミティブ (最大: =1.0E10): 27547009
for
単純型のループ (ラッパー オブジェクト):
public static void main(String[] args) {
HDouble max = new HDouble();
max.value = 1000;
for (int j = 1; j < 8; j++) {
HDouble i = new HDouble();
max.value = max.value*10;
long start = System.nanoTime();
for (i.value = 0; i.value <max.value; i.value++) {
}
long end = System.nanoTime();
long microseconds = (end - start) / 1000;
System.out.println("MicroTime wrapper(max: ="+max.value + "): " + microseconds);
}
}
結果:
MicroTime ラッパー (最大: =10000.0): 157
MicroTime ラッパー (最大: =100000.0): 1561
MicroTime ラッパー (最大: =1000000.0): 3174
MicroTime ラッパー (最大: =1.0E7): 15630
MicroTime ラッパー (最大: =1.0E8) : 155471
MicroTime ラッパー (最大: =1.0E9): 1520967
MicroTime ラッパー (最大: =1.0E10): 15373311
反復回数が多いほど、2 番目のコードは高速になります。しかし、なぜ?java-compiler と jvm がコードを最適化していることは知っていますが、プリミティブ型がフィールド アクセスを持つオブジェクトよりも遅くなる可能性があるとは思いもしませんでした。
誰かがそれについてもっともらしい説明を持っていますか?
編集: HDouble クラス:
public class HDouble {
public double value;
public HDouble() {
}
public HDouble(double value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
コードを含むループもテストしました。たとえば、合計を計算します -> 同じ動作です (違いはそれほど大きくありませんが、原始的なアルゴリズムはもっと速くなければならないと思いましたか?)。最初に私が考えたのは、計算にそれだけの時間がかかり、フィールド アクセスにほとんど違いがないことです。
ラッパー for ループ:
for (i.value = 0; i.value <max.value; i.value++) {
sum.value = sum.value + i.value;
}
結果:
MicroTime ラッパー (最大: =10000.0): 243
MicroTime ラッパー (最大: =100000.0): 2805
MicroTime ラッパー (最大: =1000000.0): 3409
MicroTime ラッパー (最大: =1.0E7): 28104
MicroTime ラッパー (最大: =1.0E8) : 278432
MicroTime ラッパー (最大: =1.0E9): 2678322
MicroTime ラッパー (最大: =1.0E10): 26665540
プリミティブ for ループ:
for (i = 0; i < max; i++) {
sum = sum + i;
}
結果:
MicroTime プリミティブ (最大: =10000.0): 149
MicroTime プリミティブ (最大: =100000.0): 1996
MicroTime プリミティブ (最大: =1000000.0): 2289
MicroTime プリミティブ (最大: =1.0E7): 27085
MicroTime プリミティブ (最大: =1.0E8) : 279939
MicroTime プリミティブ (最大: =1.0E9): 2759133
MicroTime プリミティブ (最大: =1.0E10): 27369724