Подтвердить что ты не робот

Производительность бенчмаркинга в Java VM vs .NET CLR

Вам когда-либо приходилось оправдывать выбор с использованием .NET вместо Java на основе производительности?

Для типичной системы обработки транзакций большого объема, которая может выполнять следующие операции,

  • Параллельные транзакции базы данных
  • Математические вычисления
  • Взаимодействие с другими веб-службами (SOAP/XML, XML-RPC)

Мой подход заключался бы в тестировании тестов тестов в Java для JVM и С# для .NET CLR, которые сравнивают вышеупомянутые операции с различными уровнями нагрузки и сравнивают результаты.

Настройки языка и платформы в стороне, Мне интересно узнать, как вы могли бы сделать окончательное сравнение производительности между Java VM и .NET CLR?

Существуют ли какие-либо всеобъемлющие и уважаемые критерии, которые существуют?

4b9b3361

Ответ 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!