В Google провели сравнение производительности C++, Java, Go и Scala
4 июня 2011 года
Роберт Хандт (Robert Hundt) из компании Google опубликовал отчет (PDF, 300 Кб) с результатами тестирования качества оптимизации циклов в реализациях языков 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 592882 байт 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 сек
Производительность (Показатели, относительно оптимизированного варианта на С++; Варианты "Opt" и "Dbg" отличаются используемыми режимами компиляции). 1.0x C++ Opt 23 сек 8.6x C++ Dbg 197 сек 5.8x Java 64-bit 134 сек 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 сек
Дополнение: Один из инженеров Google указал, что путем переработки варианта на языке Java с целью более рационального использования сборщика мусора, удалось приблизить производительность Java-кода к результатам C++. Кроме того, повышение эффективности работы с Java-коллекциями и использование других типов данных может поднять скорость работы Java-кода в 2-3 раза. В ответ эксперты по С++ заявили, что им удалось поднять производительность варианта на С++ примерно в 6 раз.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.