Сравнивать всегда интересно и сложно одновременно - особенно
в случае, когда сравниваемые системы выполняют одинаковые функции, но делают это
по-разному.
Современные веб-приложения становятся все более изощренными и
все более перегружаются сложной логикой. Раньше производительность таких
приложений определялась, в основном, скоростью работы того или иного 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
|
Если необходимо получить тест без конкатенации строки - просто
закомментируйте строчку кода:
Все остальные реализации теста на других языках программирования
являются абсолютно идентичными.
Результаты тестов на производительность приведены ниже.
Платформа - 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,657 секунд;
- логика + конкатенация строки: 3,680 секунд.
Платформа - Windows 2000 sp.4 (Сeleron 1700).
Язык - Perl (Active Perl).
- логика: 4 секунды;
- логика + конкатенация строки: 7 секунд.
Платформа - Windows 2000 sp.4 (Сeleron 1700).
Язык - С# (DOT.NET 1.1).
- логика: 0,030 секунды;
- логика + конкатенация строки: 0,721 секунды.
Платформа - Windows 2000 sp.4 (Сeleron 1700).
Язык - Java2 (JVM Sun 1.4.2).
- логика: 0,070 секунды;
- логика + конкатенация строки: 1,422 секунды.
Стоит отметить что, несмотря на значительное отставание, все же
достаточно неплохо показала себя реализация Active Perl для Windows - она
заслужено считается одной из лучших реализаций этого языка программирования.