СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Сравнение производительности языков программирования в черновиках Из песочницы

C++, C#, Java

Привет тебе, дорогой %UserName%.
Многие из нас задумывались, какой язык более производительный. Услышав очередной разговор о том, что Java медленная, мне стало интересно посмотреть сравнение производительности Java, C++ и С#. Очевидно, что С++ будет самым производительным, но мне интереснее узнать, какова разница в производительности у С# и Java, и сколько они проигрывают С++. Всем, кому интересно прошу под кат.

Сравнивать языки программирования будем на классической задаче – сортировке массива. Сортировать будем алгоритмом быстрой сортировки. Каждую функцию будем прогонять на одинаковых массивах размером от 10000 до 100000 с шагом в 1000, и для точных результатов будем вызывать одну и ту же функцию на одном и том же массиве 20 раз.
Все расчёты проходили на процессоре Intel 3770K с тактовой частотой 3,5ГГц под управлением Windows 8.1. Компилятор С++ и С# — .Net framework 4.5.1. Компилятор Java – javac 1.7.0_45. Разумеется программы компилировались в режиме «Release», запускались по 15 раз прежде чем получить данные выходные файлы.
Исходные массивы, можете скачать здесь.
Исходник на Java

Результат работы программы, написанной на Java

Исходник на C#

Результат работы программы, написанной на C#

Исходник на C++

Результат работы программы, написанной на C#

Построим график по полученным результатам:

Вывод:

Как и ожидалось, С++ показал лучшие результаты. Что касается борьбы между C# и Java – то очевидно, что Java выигрывает более чем в два раза у C#. К сожалению, я не могу ответить на вопрос, почему так сильно проигрывает C#, если кто-нибудь знает, напишите – буду благодарен.

комментарии (10)

+1
xGromMx ,  

А как же параллельные вычисления в С#?)

+2
Bringoff ,   * (был изменён)

Значит, говорите, что вы Наполеон для С++ вы использовали компилятор .net 4.5.1? Чудно

–1
ghaiklor ,  
C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем. (Однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET.) CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.

Пост ни о чем. Ответ на ваш вопрос выше в цитате.
0
+1 –1
Monnoroch ,   * (был изменён)

Странное сравнение, исходники совершенно разные, хотя бы тот факт, что StringTokenizer работает совершенно не так, как Split вас не смутил? Еще вы взяли буферизованный ридер для джавы, а для C# буферизацию не настроили.

+2
MFomichev ,   * (был изменён)

Сравнивалось только время сортировки, время парсинга строк не учитывалось.

0
Monnoroch ,   * (был изменён)

Действительно, не заметил, в таком случае, вроде код одинаковый.
А проверку выхода за границы массива вы выключали? Там, вроде, как-то можно.

0
aush ,   * (был изменён)

В релизной сборке и при запуске не из студии оптимизация выхода за границы должна быть там уже сама по себе, специально ее включать не надо.

UPD: хотя вот глянул сейчас код, таки там этой оптимизации, видимо, не будет.

–1
Monnoroch ,  

Неправдоподобно. Сортировка N Log(N), а у вас линейные графики.

0
barker ,  

Даже не сомневался, что под катом будет синтетический тест «100500 миллионов раз делаем какую-нибудь фигню и замеряем время». Надо пояснять, почему подобный тест вообще ниочём, или до меня уже всё сказано было?

0
IgorAdamenko ,  

Поясните незнающему, пожалуйста.