Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Лучшие статьи журнала «Компьютеры+Программы»


Информационный Канал Subscribe.Ru

Здравствуйте, уважаемые читатели!

В этом выпуске рассылки публикуется статья, занявшая по результатам голосования третье место.


Олег РЕМИЗОВ,
remisov@ukrpost.net

Сравнительный тест эффективности языков программирования для WEB

Сравнивать всегда интересно и сложно одновременно — особенно в случае, когда сравниваемые системы выполняют одинаковые функции, но делают это по-разному

Современные веб-приложения становятся все более изощренными и все более перегружаются сложной логикой. Раньше производительность таких приложений определялась, в основном, скоростью работы того или иного 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,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 — она заслужено считается одной из лучших реализаций этого языка программирования.

Олег РЕМИЗОВ,
remisov@ukrpost.net


Задать вопрос
Прислать свою статью для публикации в журнале
Просто поговорить

До следующего выпуска!
Елена Полонская, редактор "К+П"
www.comizdat.com

Перепечатка материалов этой рассылки разрешается только по согласованию с редакцией журнала "Компьютеры+Программы"


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться

В избранное