Недавно меня попросили сравнить провести тесты шаблонизатора для используемого нами фреймворка Grails. Зачем такие тесты нужны и что они, собственно, скажут о производительности приложения — не знаю. Однако это весело и народ такие тесты очень любит.
Собственно, у Grails никакого шаблонизатора нет, а есть язык Groovy, который можно использовать внутри серверных страничек (GSP — Groovy Server Pages). Итак, хотим измерить производительность языка Groovy. В качестве базовой точки отсчета используется язык PHP.
Т.к. для полноценного тестирования в нагруженном режиме требуется production-сервер, этот тест сильно упрощен и запускается без контейнера.
(Существенную часть также составляет вывод содержимого страницы, который данные тесты не учитывают — для этого требуется полноценное тестирование в контейнере)
Test.php
Test.groovy
Groovy Version: 1.6.3 JVM: Java HotSpot(TM) Server VM (build 14.0-b16, mixed mode)
Еще момент — можно попробовать PHP-акселераторы. На этой почве я попробовал Zend, но особо не повлияло. Забавно, что отключение модификаторов прав доступа к полям x-y-z ускорило PHP-скрипт.
Собственно, у Grails никакого шаблонизатора нет, а есть язык Groovy, который можно использовать внутри серверных страничек (GSP — Groovy Server Pages). Итак, хотим измерить производительность языка Groovy. В качестве базовой точки отсчета используется язык PHP.
Т.к. для полноценного тестирования в нагруженном режиме требуется production-сервер, этот тест сильно упрощен и запускается без контейнера.
Оборудование
«Мусорный» сервер IBM 325, Intel® 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-скрипт.