Производительность C++ vs. Java vs. PHP vs. Python. Тест «в лоб»
/update/ Статья обновлена по результатам обсуждения. Поправлен код Python (около 40% ускорения), написан код на Perl и Ruby (но меня терзают смутные сомнения, что с ruby я что-то сделал неправитьно), поправлен код на Java (на моей машине корректнее тестировать int, а не long. к тому же int в Java эквивалентен long в C++).
Вопрос производительности (скорости работы) различных языков часто всплывает в комментариях, на форумах, часто необоснованные :). Встречаются статьи, в которых авторы приводят примеры, где выигрывает реализация на том или ином языке.
После прочтения очередной статьи мне захотелось самому разобраться «здесь и сейчас». Сначала захотелось сравнить Java и C++ (не верил я, что в вычислительных тестах ява может догнать и обогнать cpp). 10 минут и простой код на C++ и яве готов: простой цикл и математические операции. После написания теста подумал и перевёл их на php и python. Позже добавился код на perl и ruby.
Итак, пару слов о тесте:
Алгоритм синтетический, долгий цикл (двухуровневый) и в нём вычисление математического выражения. Таким образом оценивается вычислительная производительность самого языка (интерпретатора или скомпилированного кода), никаких привязок к качеству реализации тех или иных библиотек, никаких внешних сервисов, никаких системозависимых операций (диск, сеть, графика).
1) Мне нравится ява и я честно предполагал, что результаты будут лучше. Обновлено: long в 64-х битных системах работает значительно быстрее. При работе с int в 32-х битных системах Java значительно ускоряется (на моей машине быстрее, чем C++, видимо, JVM оптимизирует исполнение по умолчанию)
2) Я догадывался, что php будет медленней C++ и Java, но не думал, что он окажется быстрее Perl.
3) Предполагал, что Python будет сопоставим с PHP, но ошибся. Видимо, стандартная поставка PHP лучше оптимизирует исполнение кода.
4) Я совсем не знаком с Ruby, код взят из одного из комментариев. Причём использован код 1, так как у меня он работает быстрее чем код 2. Возможно, это также связано с тем, что у меня 32bit-система.
5) Я достаточно уважительно отношусь к различным языкам программирования, эта статья ни одним из углов не нацелена на разжигание холиваров. Каждый язык имеет свою нишу и своих поклонников.
Тесты запускались по 5 раз минимум, чтобы избежать случайных всплесков. Запускались из консоли и как «nice -n -9», то есть с максимальным на данный момент приоритетом в системе.
Чтобы не заставлять вас читать всю статью, сразу приведу краткие результаты.
Диаграмма (обновленная):
Старый вариант здесь
На диаграмме слолбец с Ruby частично прозрачен по причине того, что на моей машине скрипт Ruby исполнялся неприлично долго, в то время как в комментарии указано, что скрипт исполняется в 4 раза быстрее скрипта на Python — я в замешательстве.
Столбец с Python прозрачен, так как при включении psyco скрипт ускоряется более чем в 10 раз. Проверил на своей машине. Но это, с моей точки зрения, хак, не отражающий собственную производительность языка.
Столбец с PERL, как могут заметить старожилы, теперь идёт вровень с Python 2.6. Причиной этому послужила смена кода с C-подобного синтаксиса на использование range. Дополнительную производительность (около 12%) можно получить использовав директиву «use integer;», но это, по-моему, тоже хак.
В виде таблицы (тоже обновлённой):
Язык | Java | Java -server | C++ | C++, -O2 | PHP | Python 2.6 | Python 3.1 | Perl 5.8 | Ruby 1.8 | Ruby 1.9(?) |
Время исполнения, сек | 5,3 | 2,8 | 8,5 | 2,6 | 62 | 91 | 145 | 91 | 207 | ~30 |
Производительность, % | 160 | 303 | 100 | 327 | 14 | 9 | 6 | 9 | 4.11 | 28 |
Время исполнения — на P4-1.8Ггц.
Производительность — относительно производительности базового кода на C++.
Добавлен столбец с запуском Java-кода с ключём «-server». После перехода с «long» на «int» (повторюсь, int в java такой же как и long в c++ на 32bit-arch) он начал давать прирост в производительности почти вдвое.
Столбец с Ruby 1.9 на моём железе не тестировался, результат перенесён через сравнение с производительностью Python’а на той же машине.
И, чтобы не быть голословным, тестовый код.
Java, Test01.java (int в Java то же что и long в C++):
package ru.dchekmarev.test.performance;
public class Test01 public static void main(String[] args) // long start = System.currentTimeMillis();
int r = 0;
for ( int i = 0; i < 10000; i++) for ( int j = 0; j < 10000; j++) r = (r + (i * j) % 100) % 47;
>
>
System.out.println( «answer: » + r);
// закомментировано, т.к. замеры делаются из командной строки
// System.out.println(«run time (millis): » + (System.currentTimeMillis() — start));
>
>
Python, Test01.py (вынос кода в функцию ускоряет работу кода почти вдвое, отдельная же инициализация range() на моей машине даёт порядка 5% производительности):
def test():
r = 0
for i in range(0, 10000):
for j in range(0, 10000):
r = (r + (i * j) % 100) % 47
test()
print ( «answer: » , r)
Perl, Test01.pl (обновлено, с range работает на 25% быстрее против c-подобного синтаксиса for):
$r = 0;
# старый вариант, C-подобный синтаксис
# for ($i = 0; $i < 10000; $i++) # for ($j = 0; $j < 10000; $j++) <
for my $i (0..9999) for my $j (0..9999) $r = ($r + ($i * $j) % 100) % 47;
>
>
print «answer: $r\n»;
Вот здесь приведён красивый пример на Perl, но, мне кажется, такой вариант уже слишком специфичен.
r = 0
for i in 0..10_000 do
for j in 0..10_000 do
r = ( r + ( i * j ) % 100) % 47
end
end
puts «answer: #»
Вот здесь в комментариях обсуждают решение на erlang.
Как видите, ничего сложного: два цикла и математическое выражение. Вычислительная задача в чистом виде.
мой оригинал — там старая версия статьи, а также информация об версиях использованного ПО и результаты тестов из консоли.
Ещё раз повторюсь: каждый язык имеет свою нишу, своих поклонников и свои задачи, с решением которых он справляется лучше других.
PS: а вообще, нет смысла загоняться и меряться чем бы то ни было, производительность самого языка важна для достаточно узкого круга задач, т.к. в общем случае, системы, библиотеки и прочая обвязка нынче несоизмеримо тяжелее самой вычислительной задачи.
Python vs. Java: сравнение для разработчиков
В современную эпоху высоких технологий программирование стало чрезвычайно популярным. Количество людей, входящих в IT-сферу, ежегодно растет в геометрической прогрессии. Всё вокруг нас «диджитализируется». И столь огромная популярность компьютерных наук и программирования уже не вызывает удивления.
В настоящее время на рынке доступно большое количество языков программирования, каждый из которых был разработан для конкретных задач. У каждого языка есть свои особенности и свое сообщество. Пожалуй, самые популярные на данный момент языки — это Python и Java. Их сравнение и станет темой нашего обсуждения.
Python vs. Java
Оба языка программирования — и Python, и Java — имеют свои особенности и обладают уникальными преимуществами. Давайте сравним эти языки, параллельно рассмотрев свойства каждого из них.
Производительность
С точки зрения производительности и времени выполнения Java явно превосходит Python. Он намного быстрее своего конкурента. В основном это связано с тем, что Python является интерпретируемым языком. Это значит, что он выполняет больше работы во время выполнения кода. Например, выясняет тип данных переменных. Как результат, Python намного медленнее.
Более того, Java использует концепцию JIT(Just-in-time)-компиляции, которая позволяет компилировать исходный код во время выполнения программы. Это, в свою очередь, делает этот язык в несколько раз быстрее в сравнении с Python.
В следующем примере мы попытались сделать реверс массива размером 10 000. Количество итераций, выполняемых кодом, составило около 1000. Вот полученные нами результаты:
Как мы видим из данного примера, Java в несколько раз быстрее Python. Таким образом, для объемного набора данных он будет иметь гораздо бóльшую производительность.
Сложность изучения
Поскольку Python является интерпретируемым языком, он имеет более удобный синтаксис по сравнению с Java. Python автоматически определяет тип данных переменных без необходимости указывать его вручную. Кроме того, в нем не используются закрывающие скобки и точки с запятой. Python написан в соответствии с правилами отступов и, следовательно, довольно легко читается и интуитивно более понятен.
Именно поэтому он так популярен среди начинающих программистов. Например, если мы хотим написать код, содержащий класс Employee, и вывести имя и фамилию сотрудника, то в Python он будет выглядеть следующим образом:
class Employee: def __init__(self, first, last): self.first = first self.last = last def print_fullname(self): print('Имя сотрудника:', self.first, self.last) employee_1 = Employee('Катерина', 'Денисенко') print(employee_1.print_fullname())
Тем временем в Java у нас будет следующий код:
public class Employee < String first; String last; public Employee(String first, String last)< this.first = first; this.last = last; >public void print_fullname() < System.out.println("Имя сотрудника:" + this.first + "" + this.last); >public static void main (String[] args) < Employee employee_1 = new Employee("Катерина", "Денисенко"); employee_1.print_fullname(); >>
Как видно из примера выше, Java имеет более сложный синтаксис. Это можно легко подтвердить ещё одним примером. Давайте выведем в консоль традиционное Hello World.
В Python это займет всего одну строчку:
А вот так будет выглядеть решение той же задачи в Java:
Таким образом, мы видим, что для начинающих программистов идеальным языком будет Python. Он намного гибче и имеет более простой синтаксис. К тому же интерфейс Python интуитивно понятнее.
Популярность на рынке и сообщество
И Java, и Python — чрезвычайно популярные языки программирования. Измерение популярности языков программирования – крайне сложная задача. Но есть сайты, которые пытаются ранжировать языки в соответствии с их популярностью. Например, Tiobe и PYPL index (Индекс популярности языков программирования).
Если взглянуть на рейтинг, который нам предлагает Tiobe, то можно увидеть, что Java находится на втором месте, а Python – на третьем. Любопытно ещё и то, что на первом месте находится C. На PYPL мы видим, что на вершине находится Python, при этом имея вдвое большую популярность, чем Java, который идет вторым.
Касательно же сообществ, и Python, и Java обладают большими и динамично развивающимися сообществами.
Для Java-программистов существует добровольная организация под названием Java User Group (JUG), которую можно найти в любом уголке мира. Ее главная цель – распространять знания языка по всему миру. Кроме того, раньше также проводилось мероприятие под названием JavaOne, на котором Java-разработчики собирались вместе и обсуждали новинки технологий.
Что касается Python, этот язык сам по себе имеет чрезвычайно большое сообщество. Согласно официальной вики, насчитывается более 1637 групп пользователей Python (Python user groups). Они рассредоточены по миру, их можно найти в 37 странах и 191 городе. В этих группах состоит 860333 человека.
Кроме того, есть еще конференции, посвященные разработке на Python, такие как PyCon и PyLadies. Они являются одними из самых популярных событий в области программирования, и их число растет с каждым годом.
Приложения
Оба этих языка широко используются для создания различных программ. Но у каждого из них есть своя «специализация». Python, например, является основным языком для приложений, связанных с машинным и глубоким обучением, благодаря наличию огромной экосистемы библиотек и фреймворков, таких как TensorFlow, Keras, PyTorch и т.д. Эти библиотеки предоставляют пользователям огромные возможности и позволяют им свободно экспериментировать.
Кроме того, Python широко используется в крупных компаниях, таких как Google и Facebook, для которых он является одним из основных рабочих языков.
С другой стороны, Java широко используется во встроенных системах, которые представляют собой комбинацию аппаратной и программной архитектур, которые предназначены для обеспечения тесного взаимодействия между аппаратными и программными компонентами.
Также Java используется в разработке приложений для Android — одной из самых популярных и высокопроизводительных мобильных операционных систем в мире. И в довершение всего, Netflix, знаменитый поставщик фильмов и сериалов на основе потокового мультимедиа, также использует Java в своей разработке.
Заключение
Python и Java — чрезвычайно популярные языки программирования. У обоих есть большие сообщества, которые поддерживают их. Оба языка используются в широком спектре приложений по всему миру. Чтобы определить, какой из языков вам больше подходит, нужно понять, где вы хотите его использовать. Для приложений корпоративного уровня более подходящим языком будет Java. Для приложений, которым требуются фреймворки машинного обучения, больше подходит Python. В целом это два отличных языка, которые позволяют создавать прекрасно функционирующие приложения.