Как же надоели некорректные сравнения платформ. Оставив в стороне различия между .NET и Java, которые не были учтены в тесте, покажу на шагах оптимизацию времени исполнения.
1. Просто запуск. Количество итераций уменьшено с 30 млн. до 5 млн., но повторяется это (ибо JIT) 10 раз
average = 6003, div = 663
Можно ли при таком разбросе что-то сравнивать? Ну, если очень хочется… но идём далее.
2. Параметры запуска приложения установлены в "-server -Xmx1024M -XX:-UseParallelGC -XX:-UseParallelOldGC -XX:+AggressiveOpts -XX:+UseBiasedLocking".
average = 5346, div = 324
3. В качестве JVM используется 1.7.0 beta x64 (x86 качается)
average = 3410, div = 340
4. Если мы тестирует дерево, а на random, то не ясно, зачем нам каждый раз новый объект. Будем использовать константный Object, заодно это избавит нас от boxing/unboxing
private final static Object OBJECT = new Object();
Tree tree = new Tree(r.nextInt(), OBJECT); // первый элемент
tree.add(r.nextInt(), OBJECT);
average = 2977, div = 197
5. Скачалась последняя JVM beta x86…
average = 2801, div = 199
6. И для сравнения совсем уберём OBJECT из кода, как сделал автор оригинального топика
average = 2772, div = 213
Заключение.
Я уверен, что подобные мелкие доработки доступны как на Java, так и на .NET. Использование «микротестов» для сравнения производительности платформ неэффективно, создаёт только «топики зла» и полезно разве что для общего развития программиста.
1. Просто запуск. Количество итераций уменьшено с 30 млн. до 5 млн., но повторяется это (ибо JIT) 10 раз
6663
6199
6322
6540
5095
6033
6741
5045
6253
5142
average = 6003, div = 663
Можно ли при таком разбросе что-то сравнивать? Ну, если очень хочется… но идём далее.
2. Параметры запуска приложения установлены в "-server -Xmx1024M -XX:-UseParallelGC -XX:-UseParallelOldGC -XX:+AggressiveOpts -XX:+UseBiasedLocking".
5681
4990
5202
4950
5892
5415
5270
5739
5200
5130
average = 5346, div = 324
3. В качестве JVM используется 1.7.0 beta x64 (x86 качается)
4146
3099
3542
3542
3125
3199
3545
3104
3653
3149
average = 3410, div = 340
4. Если мы тестирует дерево, а на random, то не ясно, зачем нам каждый раз новый объект. Будем использовать константный Object, заодно это избавит нас от boxing/unboxing
private final static Object OBJECT = new Object();
Tree tree = new Tree(r.nextInt(), OBJECT); // первый элемент
tree.add(r.nextInt(), OBJECT);
3310
2960
2795
2980
3293
3002
2803
2785
3047
2798
average = 2977, div = 197
5. Скачалась последняя JVM beta x86…
2932
2724
3198
2647
2597
2954
2896
2648
2572
2844
average = 2801, div = 199
6. И для сравнения совсем уберём OBJECT из кода, как сделал автор оригинального топика
2855
2679
3083
2566
2517
2953
2634
2640
3108
2681
average = 2772, div = 213
Заключение.
Я уверен, что подобные мелкие доработки доступны как на Java, так и на .NET. Использование «микротестов» для сравнения производительности платформ неэффективно, создаёт только «топики зла» и полезно разве что для общего развития программиста.