Проект по тестированию эффективности языков программирования
В рамках проекта PLB предпринята попытка создания тестового комплекта, охватывающего различные аспекты при оценке эффективности языков программирования. Подготовленный тестовый комплект включает реализацию четырех базовых тестовых заданий для 11 языков программирования: Си, С#, D, Go, Java, JavaScript, Lua, Perl, Python, R и Ruby. Всего протестировано 26 различных реализаций поддерживаемых языков. Эффективность оценивается с позиции производительности и потребления памяти.
В число тестов входят: Sudoku - программа для поиска решений в игре Судоку (20x50). Matmul - реализация алгоритма по умножению двух матриц размером 1000x1000, который хорошо подходит для измерения производительности циклов и оценки выполнения типичных математических задач. Patmch - программа для поиска строк в файле с использованием нескольких видов регулярных выражений (влияние скорости ввода/вывода устранено через размещение файла в памяти). Dict - поиск повторяющихся строк из списка в 5 млн строк (последовательно операция повторяется для каждой строки списка, в среднем каждая строка повторяется по 4 раза), позволяет оценить производительность хэшей и ассоциативных массивов. Тесты sudoku" и "matmul" ориентированы на измерение производительности языка, а тесты "Patmch" и "dict" производительности библиотек.
Некоторые наблюдения:
Быстрее всего простые регулярные выражения выполняются в Perl, при этом Perl в связанных с регекспами тестах в три раза обгоняет по скорости язык Си (GCC и библиотека regexp9 из Plan 9). JavaScript-движок V8 при выполнении регулярных выражений показал результаты аналогичные языку Cи (GCC), JavaScript-движок JaegarMonkey немного отстал от V8, но совсем незначительно.
В тесте, оценивающем производительность обработки строк неплохие результаты показал CPython 2.7, который отстал от GCC всего на 25% (Perl отстал в два раза, JavaScript-движок V8 и язык Java - в два с половиной раза, JavaScript-движок JaegarMonkey и язык Ruby - в три раза).
В целом JavaScript-движок V8 показал во всех тестах более высокие результаты по сравнению с движком JaegarMonkey от проекта Mozilla.
В тесте умножения матриц LuaJIT немного обогнал GCC. Java и JavaScript-движок V8 отстали от GCC всего на 10%. Для сравнения, Python отстал от GCC в 66 раз, JavaScript-движок JaegarMonkey в 7 раз, Perl в 100 раз, Ruby в 273 раза.
В эталонном тесте sudoku ближе всего к показателям языка Си (GCC) оказался язык Java, который отстал всего на 70%. JavaScript-движок V8 отстал в 3.7 раза, C#@Mono в 3.8 раз, JavaScript-движок JaegarMonkey в 18 раз, Ruby в 98 раз, CPython в 113 раз, Perl в 121 раз.
При оценке потребления памяти при обработке строк, после языка Си (52 Мб) наиболее экономичными оказались JavaScript-движок V8 (97 Мб), CPython (112 Мб), C#@Mono (113 Мб). Ruby израсходовал 156 Мб, а Perl - 219 Мб, JavaScript-движок JaegarMonkey - 274 Мб. Наихудшие результаты показали: R - 1 Гб и Jython - 457 Мб, JRuby - 436 Мб. В тесте умножения матриц расстановка сил в плане потребления памяти изменилась: Си (GCC) 32 Мб, JavaScript-движок JaegarMonkey - 35 Мб, C#@Mono - 40 Мб, Java - 67 Мб, CPython - 91 Мб, V8 - 141 Мб, Ruby - 196 Мб, Perl - 225 Мб.