以前にいくつかのパフォーマンス テストを行っていましたが、得られた結果を説明できません。
以下のテストを実行するとき、コメントを外すprivate final List<String> list = new ArrayList<String>();
と、パフォーマンスが大幅に向上します。私のマシンでは、そのフィールドが存在する場合は 70 ~ 90 ミリ秒でテストが実行されますが、コメント アウトされている場合は 650 ミリ秒です。
System.out.println((end - start) / 1000000);
また、print ステートメントを に変更すると、変数のないテストが 650 ミリ秒ではなく 450 ~ 500 ミリ秒で実行されることにも気付きました。変数が存在する場合は効果がありません。
私の質問:
- 私がその変数を使用していないことを考えると、変数の有無にかかわらず、ほぼ10の係数を説明できる人はいますか?
- その print ステートメントはパフォーマンスをどのように変更できますか (特に、パフォーマンス測定ウィンドウの後に来るため)。
ps: 順次実行すると、3 つのシナリオ (変数あり、変数なし、別の print ステートメントあり) はすべて約 260 ミリ秒かかります。
public class SOTest {
private static final int ITERATIONS = 10000000;
private static final int THREADS = 4;
private volatile long id = 0L;
//private final List<String> list = new ArrayList<String>();
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(THREADS);
final List<SOTest> objects = new ArrayList<SOTest>();
for (int i = 0; i < THREADS; i++) {
objects.add(new SOTest());
}
//warm up
for (SOTest t : objects) {
getRunnable(t).run();
}
long start = System.nanoTime();
for (SOTest t : objects) {
executor.submit(getRunnable(t));
}
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
long end = System.nanoTime();
System.out.println(objects.get(0).id + " " + (end - start) / 1000000);
}
public static Runnable getRunnable(final SOTest object) {
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < ITERATIONS; i++) {
object.id++;
}
}
};
return r;
}
}
編集
3 つのシナリオで 10 回実行した結果を以下に示します。
- 短い print ステートメントを使用して、変数なしで
- 変数なしで、長い print ステートメントを使用 (オブジェクトの 1 つを出力)
- 順次実行 (1 スレッド)
- 変数で
1 657 473 261 74
2 641 501 261 78
3 651 465 259 86
4 585 462 259 78
5 639 506 259 68
6 659 477 258 72
7 653 479 259 82
8 645 486 259 72
9 650 457 259 78
10 639 487 272 79