質問: " + n); } 2 * (i * i)を2 * i * iに置き換えた場合、実行には0.60から0.65秒かかります。どうして?私はプログラムの各バージョンを15回実行しました。結果は次のとおりです。 2*(i*i) | 2*i*i ----------+---------- 0.5183738 | 0.6246434 0.5298337 | 0.6049722 0.5308647 | 0.6603363 0.5133458 | 0.6243328 0.5003011 | 0.6541802 0.5366181 | 0.6312638 0.515149 | 0.6241105 0.5237389 | 0.627815 0.5249942 | 0.6114252 0.5641624 | 0.6781033 0.538412 | 0.6393969 0.5466744 | 0.6608845 0.531159 | 0.6201077 0.5048032 | 0.6511559 0.5232789 | 0.6544526 2 * i * iの最速実行は、最も遅い2 * (i * i)の実行よりも時間がかかりました。両者が同じくらい効率的であれば、この確率は1/2 ^ 15 * 100%= 0.00305%未満になります。
回答: さらに補遺です。 ibmの最新のjava 8 jvmを使用して実験を再現しました。java version "1.8.0_191" java(tm) 2 runtime environment, standard edition (ibm build 1.8.0_191-b12 26_oct_2018_18_45 mac os x x64(sr5 fp25)) java hotspot(tm) 64-bit server vm (build 25.191-b12, mixed mode) これは非常によく似た結果を示しています。0.374653912 s n = 119860736 0.447778698 s n = 119860736 (2 * i * iを使った2番目の結果).興味深いことに、同じマシンでoracle javaを使用している場合は、次のようになります。java version "1.8.0_181" java(tm) se runtime environment (build 1.8.0_181-b13) java hotspot(tm) 64-bit server vm (build 25.181-b13, mixed mode) 結果は平均して少し遅くなります。0.414331815 s n = 119860736 0.491430656 s n = 119860736 短い話:hotspotのマイナーバージョン番号でさえ、ここで問題になります。jit実装内のわずかな違いが顕著な影響を与える可能性があるからです。