Недавно меня попросили сравнить провести тесты шаблонизатора для используемого нами фреймворка Grails. Зачем такие тесты нужны и что они, собственно, скажут о производительности приложения — не знаю. Однако это весело и народ такие тесты очень любит.

Собственно, у Grails никакого шаблонизатора нет, а есть язык Groovy, который можно использовать внутри серверных страничек (GSP — Groovy Server Pages). Итак, хотим измерить производительность языка Groovy. В качестве базовой точки отсчета используется язык PHP.

Т.к. для полноценного тестирования в нагруженном режиме требуется production-сервер, этот тест сильно упрощен и запускается без контейнера.

Оборудование:

«Мусорный» сервер IBM 325, Intel(R) Pentium-4 2.40GHz, 1GB RAM.

Тестовые программы:

95% начинки веб-приложения с точки зрения кода составляют циклы, создание объектов, обращение к полям объекта. Из этих соображений написаны две простейшие программы, работающие в консольном режиме.

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

Test.php

<?php
        class My {
                public $x;
                public $y;
                public $z;
        }

        $t1 = gettimeofday(true);
        $arr = array();
        for($i = 0; $i < 100; $i++) {
                $entry = new My();
                $entry->x = 'A';
                $entry->y = 'B';
                $entry->z = 'C';
                array_push($arr, $entry);
        }
        $iterations = (int) $argv[1];
        print $iterations." iterations.\n";
        for($i = 0; $i < $iterations; $i++) {
                $x = null;
                foreach($arr as $entry) {
                        $x = $entry->x.$entry->y.$entry->z;
                }
        }
        print "\n".(gettimeofday(true) - $t1)." sec.\n";
?>

Test.groovy

class My {
        def x, y, z;
}

def t = System.currentTimeMillis()

arr = []

for(def i = 0; i < 100; i++) {
        def entry = new My(x:'A',y:'B',z:'C')
        arr << entry
}
def iterations = args[0] as int;
println "Using ${iterations} iterations.";
for(def k = 0; k < iterations; k++) {
        def x = null
        for(def entry : arr) {
                x = entry.x + entry.y + entry.z
        }
}
println "${(System.currentTimeMillis() - t) / 1000.0} sec.";

Софт

PHP 5.2.6 (cli) (built: May 8 2008 08:38:47)
Groovy Version: 1.6.3 JVM: Java HotSpot(TM) Server VM (build 14.0-b16, mixed mode)

Результаты

Число итераций Test.php, сек. Test.groovy, сек.
10.000 1.38 2.07
20.000 2.77 3.15
30.000 4.2 4.3
50.000 6.9 6.5
100.000 13.8 12.1
300.000 41 34
500.000 68 57
1.000.000 136 111

Выводы

Производительность Groovy-программы существенно улучшается при увеличении числа итераций. Связано это, скорее всего, с работой HotSpot-компилятора.

Еще момент - можно попробовать PHP-акселераторы. На этой почве я попробовал Zend, но особо не повлияло. Забавно, что отключение модификаторов прав доступа к полям x-y-z ускорило PHP-скрипт.

  • Sharing

    Facebooktwittergoogle_plusredditpinterestlinkedinmailby feather