Сравнивать всегда интересно и сложно одновременно - особенно в случае, когда
сравниваемые системы выполняют одинаковые функции, но делают это по-разному.
Современные веб-приложения становятся все более изощренными и все более
перегружаются сложной логикой. Раньше производительность таких приложений
определялась, в основном, скоростью работы того или иного sql-сервера и тем,
существует ли для него достаточно эффективная реализация драйвера доступа к
sql-серверу для выбранного языка программирования. Это объясняется тем, что
первое поколение веб-приложений просто читало и писало информацию в базы данных.
Пользователей при этом было относительно немного. Таким образом, время на
отработку sql-запроса составляло 70…90% от общего времени обработки
http-запроса.
С повышением требований к масштабируемости (увеличение
количества пользователей) и наращиванием логики приложения требования к языку
программирования и среде выполнения существенно возрастают. К этому следует
также прибавить, что относительно недавно веб-приложения перешли из мира
интернет в мир корпоративных приложений. Это снова повысило требования к
эффективности среды выполнения.
В настоящие время для создания
веб-приложений существует множество различных языков программирования. Самые
популярные из них - php, perl, С# (dot.net), java2. Классическая технология asp
становится историей, поскольку asp dot.net практически вытиснило эту технологию
на windows-серверах в новых приложениях.
Причиной появления этой статьи
было желание получить представление об эффективности этих языков
программирования относительно друг друга. Поискав немного, я не нашел на эту
тему ничего интересного и решил самостоятельно написать небольшие
тесты.
Существует огромное количество тестов, сравнивающих
производительность веб-приложений, реализованных с помощью asp dot.net с java2
технологий. Тесты эти достаточно сложны - как правило, это классическое "pet
shop"-приложение (или его аналог), реализованное в двух вариантах. Соотношение
производительности в этих случаях определяется как отношение времени реакции
приложения на http-запрос при одинаковом числе запросов в секунду. Соотношение
при стрессовой нагрузке при этом обычно составляет 2/3 в пользу dot.net. Прежде
всего, это объясняется более эффективной реализацией dot.net-машины и очень
тесной интеграцией с mssql-сервером. При этом такие приложения не отличаются
большим количеством бизнес-логики.
А вот сравнений с современными
скриптовыми языками, такими как perl и php, я и вовсе не нашел.
Для
выяснения потенциала языков программирования было решено написать простые тесты
в виде консольных приложений. Цель этого приложения - эмуляция большого
количества бизнес логики, то есть циклов и условных переходов. Далее в тест была
добавлена конкатенация строки, поскольку это одно из самых часто встречающихся
операций в бизнес-логике веб-приложений. Тест является синтетическим, но я и не
ставил себе целью получение реальной картины при работе среднего приложения.
Целью, скорее, являлось получение некоторых экстремальных условий. Выводы
делайте сами. Единственное, что можно сказать в утешение любителям скриптовых
языков, это то, что взаимодействие с базами данных у них реализовано посредством
native-драйверов, что в значительной степени увеличивает скорость работы в самом
узком месте любого веб-приложения. Для себя же я сделал заключение, что не стану
использовать их для создания чего-либо ответственного.
Задача
бизнес-логики теста - это нахождение первых ста простых чисел. (Напомню, что
простое число - это такое число, которое может быть получено только умножением
самого себя на единицу.) Естественно, если бы в реальном приложении стояла
подобная задача, то целесообразнее было бы, найдя эти числа один раз, просто
записать их виде массива из 100 чисел. К сожалению, в реальной жизни не все
задачи можно решить предварительно. Результаты вывода программы перенаправлялись
в текстовый файл, что позволило в значительной степени оптимизировать потери при
выводе текста на консоль. Хотя программа выводит всего сто строк, разница
получается достаточно ощутимая. Ниже приведен исходный код java-варианта
приложения. Он достаточно прост и не нуждается в дополнительных
пояснениях:
import java.text.*; import java.util.*; public class
test { public static void main (string [] args) { int maxprimes =
100; int value = 1; int count = 0; stringbuffer sb = new
stringbuffer (); long start = system.currenttimemillis
(); system.out.println ("printing the first " + maxprimes + " numbers that
are prime… n"); while (count < maxprimes)
{ value++; int composite = 0; //false for (int i = 2; i
< value; i++) { for (int j = i; j < value; j++)
{ sb.append ("a"); if ((j * i) == value)
{ composite = 1; //true break; } } if (composite == 1)
{ break; } } if (composite == 0)
{ count++; system.out.println (value + " is
prime"); } } long time = (system.currenttimemillis () -
start); system.out.println ("took " + time + " mseconds."); long len =
sb.length (); system.out.println ("string length " + len + "
symbols."); } } // end of class
Если необходимо получить
тест без конкатенации строки - просто закомментируйте строчку
кода:
// sb.append ("a");
Все остальные реализации
теста на других языках программирования являются абсолютно
идентичными.
Результаты тестов на производительность приведены
ниже.
Платформа - linux redhat 9 (celeron 1700) под vmware. Язык -
perl.
логика: 6 секунд; логика + конкатенация строки: интерпретатор
не справился с выполнением теста. Тест выполнялся более десяти минут. Мне
надоело ждать, и я прекратил его выполнение. Платформа - linux redhat 9
(Сeleron 1700) под vmware. Язык - php4.2.2
логика: 15 секунд;
логика + конкатенация строки: тест не выполнен с ошибкой интерпретатора -
"превышено время ожидания 30 секунд - выполнение прервано". Платформа -
linux redhat 9 (Сeleron 1700) под vmware. Язык - java2 (jvm sun
1.4.2).
логика: 0,030 секунды; логика + конкатенация строки: 0,721
секунды. Платформа - windows 2000 sp.4 (Сeleron 1700). Язык - java2 (jvm
sun 1.4.2).
логика: 0,070 секунды; логика + конкатенация строки:
1,422 секунды. Стоит отметить что, несмотря на значительное отставание, все
же достаточно неплохо показала себя реализация active perl для windows - она
заслужено считается одной из лучших реализаций этого языка программирования.