За исключением языковых и платформенных предпочтений, мне интересно услышать, как вы будете проводить окончательное сравнение производительности между Java VM и .Net CLR?
Я бы написал набор тестов, предназначенных для сравнения различных характеристик двух виртуальных машин и их стандартных библиотек. Мой опыт в технических вычислениях, поэтому я бы порекомендовал следующее:
- В регистре целочисленная арифметика, например, Фибоначчи.
- В регистровой арифметике с плавающей запятой, например Мандельброт.
- Итерация массива, например FFT.
- Распределение, например чисто функциональные красно-черные деревья.
- Хеш-таблицы с клавишами и значениями типа int или float.
- Хеш-таблицы со строковыми ключами и значениями.
- Строки.
- Регулярные выражения.
- File IO.
Возможно, вы можете придумать что-то похожее для баз данных и веб-сервисов.
Не забывайте, что языки, расположенные поверх CLR, имеют совершенно разные свойства. Например, inline
в языке F # позволяет автоматизировать оптимизацию, которая может дать огромный прирост производительности по сравнению с C #. И наоборот, goto
в C # позволяет вам делать некоторые вещи более эффективно, чем это возможно в F #, а оптимизация структур была более эффективной в C #, чем F # (последнее, что я смотрел).
Существуют ли какие-либо всеобъемлющие и уважаемые критерии?
Нет, но есть много разрозненных ориентиров, которые фокусируются на выбросах, потому что они более интересны. Например, это сообщение в блоге описывает, почему простой эталонный тест хеш-таблицы может быть в 17 раз быстрее в F # в .NET, чем в Java в JVM. В этом случае причина была в том, что типы значений и усовершенствованные обобщенные элементы позволяют писать гораздо более эффективную реализацию универсальных хеш-таблиц в .NET, чем в JVM.