Роберт Хандт (Robert Hundt) из компании Google опубликовал отчет с результатами тестирования качества оптимизации циклов в реализациях языков C++, Java, Go и Scala. Как и ожидалось, в тестах производительности и потребления памяти лидирует C++, но в отчете отмечается, что достижение высоких показателей связано с необходимостью проведения дополнительных оптимизаций, которые требуют дополнительной квалификации и зачастую не используются программистами среднего уровня. Java отмечен как язык, наиболее простой для реализации кода, но с другой стороны труднопредсказуемый в плане анализа производительности - использование Java VM и сборщика мусора значительно затрудняет тюнинг производительности.
Оценка числа строк кода, потребовавшихся для реализации поставленной задачи (в списке указан размер, относительно кода на языке Scala. Признаком Pro отмечены результаты оценки варианта кода после дополнительного тюнинга и использования специфичных для языка конструкций). Наиболее компактным языком оказался Scala - для решения задачи потребовалось 658 строк.
1.3x | C++ Dbg/Opt | (850 строк |
1.6x | Java | 1068 строк |
1.9x | Java Pro | 1240 строк |
1.0x | Scala | 658 строк |
0.5x | Scala Pro | 297 строк |
1.4x | Go | 902 строки |
1.2x | Go Pro | 786 строк |
Размер результирующих бинарных файлов, после сборки (показатели, относительно размера сгенерированного JAR-архива). Java и Scala работают поверх Java VM и генерируют байт код, а C++ и Go - готовые к исполнению машинные инструкции. Наиболее компактный результирующий файл получился у Java - 13 Кб, у языка Go бинарный файл занял 1.2 Мб, а оптимизированный вариант на C++ - 41 Кб.
45x | C++ Dbg | 592892 байт |
3.1x | C++ Opt | 41507 байт |
1.0x | Java | 13215 байт |
1.6x | Java Pro | 21047 байт |
3.6x | Scala | 48183 байт |
2.8x | Scala Pro | 36863 байт |
94x | Go | 1249101 байт |
92x | Go Pro | 1212100 байт |
Потребление памяти (показатели, относительно реализации на языке C++). Для работы кода на Java и Scala потребовалось в 6 раз больше памяти, чем на языке Cи. Наибольшую прожорливость проявил язык Go.
1x | C++ Opt | virt 184 Мб | real 163 Мб |
2.6x | C++ Dbg | virt 474 Мб | real 452 Мб |
6x | Java | virt 1109 Мб | real 617 Мб |
6x | Scala | virt 1111 Мб | real 293 Мб |
90x | Go | virt 16.2 Гб | real 501 Мб |
Время компиляции (показатели, относительно языка Go, который отличился высокой скоростью компиляции).
6.5x | C++ Dbg | 3.9 сек |
5.0x | C++ Opt | 3.0 сек |
5.2x | Java | 3.1 сек |
5.0x | Java Pro | 3.0 сек |
23.1x | Scala scalac | 13.9 сек |
6.3x | Scala fsc | 3.8 сек |
18.8x | Scala Pro scalac | 11.3 сек |
5.8x | Scala Pro fsc | 3.5 сек |
2.0x | Go | 1.2 сек |
1.0x | Go Pro | 0.6 сек |
Производительность (показатели, относительно оптимизированного варианта на С++).
1.0x | C++ Opt | 23 сек |
8.6x | C++ Dbg | 197 сек |
5.8x | Java 64-bit | 34 сек |
12.6x | Java 32-bit | 290 сек |
4.6x | Java 32-bit GC | 106 сек |
3.7x | Java 32-bit SPEC GC | 89 сек |
3.6x | Scala | 82 сек |
2.9x | Scala low-level | 67 сек |
2.5x | Scala low-level GC | 58 сек |
7.0x | Go 6g | 161 сек |
5.5x | Go Pro | 126 сек |