ява(из-за динамического профайлинга) или, что чуть вероятнее, в C.
AnToXa, а что такое
динамический профайлинг и как он влияет на скорость исполнения программ виртуальной машиной ява?
и расскажи нам как ты тестил.
Все началось с того, что мне на глаза попалась вот эта статья:
http://soft.compulenta.ru/2004/6/17/47645/, в которой говорится, что виртуальная машина ява исполняет код быстрее, чем процессор - машинные инструкции, полученные компилятором gcc из исходного кода на C++. Я не поверил. И решил провести "независимое тестирование", включив в него кроме java и Си еще PHP c perl'ом.
Перед тестированием не было сомнений, что Cи всех сделает. Я предполагал, что perl будет быстрее, чем PHP. Но даже не догадывался, какое место займет java.
Для начала приведу версии компиляторов и интерпретаторов, которые использовались во время тестирования:
java - client JVM 5 beta как под винду, так и под юникс. Скачать можно отсюда:
http://java.sun.com/j2se/1.5.0/download.jsp
Cи - lcc-win32 под винду. Скачиваем отсюда:
http://www.cs.virginia.edu/~lcc-win32/, gcc 3.4.2 под юникс
http://gcc.gnu.org/
PHP - PHP5.0.2 как под винду, так и под юникс. Неужели не знаете, откуда скачать?
http://www.php.net/downloads.php
perl - ActivePerl 5.8.4.810 под винду.
http://activestate.com/Products/ActivePerl/
Во всех компиляторах и интерпретаторах использовались настройки по умолчанию. Debug mode везде отключен.
Засекалось время, непосредственно затраченное на сортировку, а не общее время выполнения программы.
Получены следующие результаты:
1) Java - как это ни парадоксально, но первое место заняла java. Кто-нибудь может внятно объяснить, как интерпретатор байт-кода оказался быстрее, чем процессор, непосредственно исполняющий машинные инструкции, полученные компилятором Си? Не стоит забывать, что в java встроена проверка на границы массива, динамическое управление памятью и многопоточность, которые явно не прибавляют ей скорости.
2) Cи. Ненамного отставал (10% - 50%) от java абсолютно на всех алгоритмах сортировки.
3) perl. Медленне, чем Си, раз эдак в 50.
4) PHP. Медленне, чем perl, в 2 раза. Т.е. медленне, чем Cи, в 100 раз.
Выводы:
1) не используйте perl и PHP для сортировки больших массивов чисел
![Smile :) :)](/talk/styles/default/xenforo/smilies/smile.png)
2) После этих тестов у меня кардинально изменилось отношение к java.
3) самый быстрый алгоритм сортировки огромных массивов равномерно распределенных по всей области значений случайных целых чисел (больше десяти миллионов) - восходящая поразрядная сортировка. Ее алгоритм приведен в начале треда. Например, на компьютере с процессором Althlon-800Mhz под win2k, этот алгоритм, реализованный на java, сортирует массив из десяти миллионов элементов за 5 секунд, а С-шная функция
qsort() из библиотеки
stdlib.h справляется с аналогичным массивом в среднем за 32 секунды.