Производительность бенчмаркинга в Java VM vs .NET CLR
Вам когда-либо приходилось оправдывать выбор с использованием .NET вместо Java на основе производительности?
Для типичной системы обработки транзакций большого объема, которая может выполнять следующие операции,
- Параллельные транзакции базы данных
- Математические вычисления
- Взаимодействие с другими веб-службами (SOAP/XML, XML-RPC)
Мой подход заключался бы в тестировании тестов тестов в Java для JVM и С# для .NET CLR, которые сравнивают вышеупомянутые операции с различными уровнями нагрузки и сравнивают результаты.
Настройки языка и платформы в стороне, Мне интересно узнать, как вы могли бы сделать окончательное сравнение производительности между Java VM и .NET CLR?
Существуют ли какие-либо всеобъемлющие и уважаемые критерии, которые существуют?
Ответы
Ответ 1
У меня нет точных чисел относительно эффективности JVM и CLR, но разница, если таковая имеется, может быть малой.
Однако, с языковой стороны, у С# есть несколько более низкоуровневых конструкций, чем Java, что позволит увеличить оптимизацию.
Конструкции, такие как:
-
Пользовательские значения типов. Быстрое выделение, отсутствие накладных расходов памяти (что составляет 12 байт для ссылочного типа в CLR и JVM, если я правильно помню). Полезно для вещей, которые позволяют естественным образом выражаться как ценности, такие как векторы и матрицы. Итак, математические операции. Объедините это с ref
и out
, чтобы избежать чрезмерного копирования этих больших типов значений.
-
Небезопасные блоки кода, которые позволяют немного оптимизировать "близко к металлу". Например, в то время как CLR и JVM могут избегать проверок границ в некоторых ситуациях, во многих случаях они не могут и каждый доступ к массиву требует проверки того, находится ли индекс по-прежнему в пределах массива. Использование небезопасного кода позволяет вам получить доступ к памяти массива напрямую с помощью указателей и обойти любые проверки границ. Это может означать значительную экономию. А на стороне самого низкого уровня также есть stackalloc
, который позволяет выделять массивы непосредственно в стеке, тогда как нормальный массив распределяется по куче, который медленнее, но также более удобен. Я лично не знаю практических приложений stackalloc
.
-
Истинные дженерики, в отличие от стилей стирания Java, избегают ненужных кастингов и бокса. Но если это проблема в вашей программе Java, ее можно легко решить с помощью некоторой дополнительной работы (переход от, например, ArrayList<Integer>
к настраиваемому типу, который внутренне использует буфер int[]
.)
Все это кажется предвзятым по отношению к С#, и я думаю, что С# имеет лучшие языковые конструкции низкого уровня, которые могут помочь в производительности. Тем не менее, я сомневаюсь, что эти различия действительно имеют значение (и они могут даже не применяться в вашем случае, использование указателей не дает вам ничего, если все, что вы делаете, это доступ к базе данных, где Java может быть быстрее), если выбор мешает вам каким-либо другим способом (например, перекрестная платформа). Идите на правильность, платформу, которая соответствует вашим требованиям, а не незначительные различия в производительности.
Ответ 2
окончательное сравнение производительности между Java VM и .Net CLR - это мечта.
Вы всегда можете сделать тест производительности, который сделает один взгляд лучше, чем другой, поскольку инженерная сложная система всегда включает компромиссы.
Если вы сократите тип тестов до скорости выполнения и памяти, вы можете найти такие статьи:
http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx
это отнюдь не конец дискуссии.
Ответ 3
Язык и предпочтения платформы в стороне, мне интересно узнать, как вы собираетесь делать окончательное сравнение производительности между Java VM и .NET CLR?
Я бы написал набор тестов, предназначенных для сравнения различных характеристик двух виртуальных машин и их стандартных библиотек. Мой опыт в технических вычислениях, поэтому я бы рекомендовал следующее:
- В регистровой целочисленной арифметике, например. Фибоначчи.
- В регистровой арифметике с плавающей запятой, например. Мандельброт.
- Итерация массива, например. FFT.
- Выделение, например. чисто функциональные красно-черные деревья.
- Хэш-таблицы с int или float ключами и значениями.
- Хэш-таблицы со строковыми клавишами и значениями.
- Строки.
- Регулярные выражения.
- Файл IO.
Возможно, вы можете найти что-то похожее для баз данных и веб-сервисов.
Не забывайте, что языки, сидящие поверх CLR, имеют совершенно разные свойства. Например, inline
на языке F # позволяет автоматизировать оптимизацию, которая может принести огромные выигрыши в производительности по сравнению с С#. И наоборот, goto
в С# позволяет вам делать что-то более эффективно, чем это возможно в F #, а оптимизация на структурах более эффективна в С#, чем F # (последний раз я смотрел).
Существуют ли какие-либо всеобъемлющие и уважаемые критерии, которые существуют?
Нет, но есть множество разбросанных тестов, которые фокусируются на выбросах, потому что они более интересны. Например, это сообщение в блоге описывает, почему простой общий хэш-таблица может быть в 17 раз быстрее в F # на .NET, чем в Java на JVM. В этом случае причина заключалась в том, что типы значений и обобщенные дженерики позволяют писать гораздо более эффективную общую реализацию хэш-таблицы на .NET, чем на JVM.
Ответ 4
Да, есть эталонная игра, она довольно всеобъемлющая и позволяет сравнивать разные вещи.
http://shootout.alioth.debian.org/
Единственное, что использует моно, а не визуальная студия, но разница в производительности между двумя сейчас очень мала.
обычно java обычно немного быстрее (в зависимости от того, что вы делаете), но использует гораздо больший объем памяти, и оба они имеют одинаковый размер источника.
Ответ 5
FYI вам специально не разрешено использовать код платформы .NET для любой формы бенчмаркинга, не обращаясь сначала к Microsoft и не получив одобрения.
Если бы вы захотели опубликовать что-то, я подумал, что дам вам знать.
Из памяти MS сделал некоторый книжный магазин, магазин для животных, который Java сделал сначала, чтобы показать, как их программное обеспечение может работать более эффективно при одной и той же задаче. Я пытаюсь думать об этом.
.NET Pet Store
Ответ 6
Тесты... Вы можете доказать почти все, что испытывает, что соответствует вашим потребностям.
Кроме Чака Норриса. Чак Норрис медленнее и быстрее, чем Х, если он так выбирает.
Еще один момент. Скажем, вы догадались, что Java быстрее. Будет ли это означать, что через 2 года он все равно будет быстрее?
Если Java на 5% быстрее, а .NET на 10% легче работать с тем, что вы бы выбрали?
Есть много факторов, и производительность - лишь один из них. И если различия небольшие (я думаю, что они есть), это, вероятно, не самый важный.
Если вы не строите что-то очень критичное для производительности.
Ответ 7
Я также задавался вопросом, что даст лучшую производительность. Но я понятия не имею, как я мог бы выполнить тест на стендовый знак для этого.
Хороший вопрос - надеюсь, мы все получим здесь несколько советов.
Я бы догадался, что это тестовое тестирование должно было бы стать "эталонным" испытанием ( "легковым" настройкой и запуском 1 разработчиком)?
У меня есть такая информация, это было бы здорово. Меня часто просят оценить технологии самостоятельно в короткие сроки.
Приятный один bunn_online!