Yii tritt gegen das APF an

Der Artikel Performance of Yii unter http://www.yiiframework.com/performance beschreibt einen Performance-Vergleich verschiedener PHP-Frameworks. Da das APF in dieser Liste nicht aufgeführt war, wollten wir dies in einem eigenen Test nachholen. Als repräsentative Kandidaten wurden CakePHP 1.2.1.8004,Yii 1.0.2.r614 und APF 1.8-2009-01-09-2214 ausgewählt. Das Ergebnis des Tests ist in der nach folgenden Grafik zusammengefasst:

Yii vs. APF - requests per second performance benchmark

1. Einleitung

Die Messung der Größe requests per second beleuchtet vor Allem den Gesichtspunkt des Overhead eines Frameworks. Allgemein formuliert also den Performance-Nachteil, den sich ein Entwickler mit dem Einsatz eines Frameworks erkauft. Aus diesem Grund wurde als Vergleichsapplikation eine Hallo Welt!-Anwendung eingesetzt. Ein schöner Nebeneffekt ist zudem, dass der Test dadurch möglichst einfach auszuwerten und (nahezu) frei von Designfehlern bei der Nutzung des Frameworks (für Unerfahrene) ist. Es wird dadurch nahezu nur die maximale Durchsatz-Performance bei der Nutzung des Frameworks gemessen.

Wie im Artikel View based caching - ein HOWTO zu lesen ist, ist Performance im Webbereich bereits ein sehr wichtiges Thema, das mit der steigenden Zahl der mobilen Endgeräte nochmals an Bedeutung gewinnt. Der in der Übersichtsgrafik aufgezeigte signifikante Unterschied einzelner Frameworks inspirierte uns, den Test mit wenigen Test-Kandidaten nachzustellen und die Performance des APF dagegenzustellen.

Zur Kategorisierung der Ergebnisse kann später sowohl der oben aufgezeite Artikel, als auch der auf der APF-Seite veröffentlichte Artikel PHP-Frameworks im Test genutzt werden.

2. Test-Beschreibung

2.1. Umgebung

Um die Vergleichbarkeit der Ergebnisse mit der Yii-Performance-Messung bestmöglich zu gewährleisten wurde der Testaufbau identisch gehalten. Als Test-Maschine diente ein LINUX-Server (virtuelle VMWare Maschine) mit folgenden Leistungsdaten:
Shell
[root@centos53 ~]# cat /etc/redhat-release CentOS release 5.2 (Final) [root@centos53 ~]# cat /proc/meminfo (gekürzt!) MemTotal: 1035244 kB [root@centos53 ~]# cat /proc/cpuinfo (gekürzt!) processor : 0 vendor_id : GenuineIntel model name : Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz cpu MHz : 2592.732 cache size : 6144 KB processor : 1 vendor_id : GenuineIntel model name : Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz cpu MHz : 2592.732 cache size : 6144 KB [root@centos53 ~]# lsscsi [0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda [root@centos53 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VG_LOCAL-LV_ROOT 18G 2.4G 15G 15% / /dev/sda1 99M 18M 77M 19% /boot tmpfs 506M 0 506M 0% /dev/shm [root@centos53 ~]# rpm -qa | grep -E "httpd|php" (gekürzt!) php-cli-5.1.6-20.el5_2.1 php-gd-5.1.6-20.el5_2.1 php-pecl-memcache-2.2.3-1.el5_2 php-mysql-5.1.6-20.el5_2.1 php-common-5.1.6-20.el5_2.1 httpd-2.2.3-11.el5_2.centos.4 php-5.1.6-20.el5_2.1 php-devel-5.1.6-20.el5_2.1
Für das Caching der PHP-Dateien (aka. bytecode cache) wurde die aktuelle APC-Version (3.0.18) aus den Quellen kompiliert und mit folgenden Parametern konfiguriert:
Shell
[root@centos53 ~]# cat /etc/php.d/apc.ini extension=apc.so apc.enabled=1 apc.shm_segments=1 apc.optimization=1 apc.shm_size=32 apc.ttl=7200 apc.user_ttl=7200 apc.num_files_hint=1024 apc.mmap_file_mask=/tmp/apc.XXXXXX apc.enable_cli=1 apc.cache_by_default=1 apc.stat=0
Wie an den Konfigurationsparametern zu sehen ist, wurde apc.stat nicht aktiviert um den Filesystem-Zugriff zu minimieren. Diese Einstellung wurde auch im Original-Test so gewählt.

2.2. Test-Verfahren

Als Messgröße wurde - dem Original-Test nachempfunden - die erreichbare Durchsatzrate verwendet. Zur Messung dieser Größe wurde das Apache HTTP server benchmarking tool verwendet. Um einen reellen Test zu erreichen simuliert das Tool eine Lastsituation von 10 parallel zugreifenden Benutzern über eine Dauer von 30s. Für jeden Test-Kandidaten wurde ein eigener VHOST erstellt und zur Zeit der Messung aufgerufen.

Die Testserie umfasst 4 Messungen der im letzten Absatz beschriebenen Art. Die ersten beiden Messungen dienen der Erfassung der Durchsatzrate ohne byte code caching, die zwei folgenden zeigen die Beschleunigung, die mit APC möglich ist. Zwischen den Tests wurde der Apache jeweils neu gestartet um gleiche Anfangsbedingungen zu schaffen. Im Test wurde bei der Verwendung von einem "warmup" abgesehen, da dies nicht einer reellen Situation im täglichen Live-Betrieb (z.B. nach einem Softwarerelease) entspricht. Auf der Maschine wurden wärend der Test-Läufe keine weiteren Programme oder Dienste ausgeführt, die das Ergebnis verfälschen würden.

3. Ergebnis

3.1. Übersicht

Das detaillierte Ergebnis ist in der nachfolgenden Grafik inkl. der Messwerte dargestellt:
RPS-Benchmark
  Ohne APC [RPS] Mit APC [RPS]
  1. Test 2. Test Durchschnitt 1. Test 2. Test Durchschnitt
CakePHP 30.94 31.53 31.24 141.83 141.33 141.58
Yii 121.23 116.36 118.80 935.78 935.63 935.71
APF 254.58 223.94 239.26 1023.29 986.34 1004.82
Yii vs. APF - requests per second performance benchmark

3.2. Detailbetrachtung

Die folgende Liste stellt eine Interpretation der Ergebnissen dar:
  • Der Unterschied zwischen CakePHP und Yii scheint genauso groß zu sein wie im Yii Performance-Test.
  • Die Optimierungsmöglichkeit beim APF mit APC sind im Verhältnis nicht so groß wie bei den Kandidaten CakePHP und Yii (APF: 1005/239 (~420%) gegenüber Yii: 936/119 (~780%)).
    Die absolute Performance ist jedoch ohne APC um rund 100% und mit APC um etwa 8% höher.
  • Yii erhebt den Anspruch, dass die Performance zu einem sehr großen Teil auf die Architektur zurückzuführen ist. Dies kann auch für das APF bekräftigt werden. Es ist jedoch zu beachten, dass die Messergebnisse sich bei Aktivieren von apc.stat mit einem Performance-Vorteil von rund 13% zu Gunsten des APF entwickelt. Dies lässt den Schluss zu, dass das lazy class loading zwar gut funktioniert, nur die Segmentierung der Klassen-Dateien etwas unvorteilhafter ausgelegt ist.
  • Beim Test des APF kommt erschwerend hinzu, dass gegenüber den beiden anderen Testkandidaten das Ausgabe-Template aus einer zusätzlichen Datei geladen werden muss, was zusätzlichen File-IO erzeugt. Wird der Inhalt der Ausgabe beim Yii-Framework per file_get_contents() aus einer Text-Datei gelesen, so steigt der Performance-Vorteil des APF auf 13% bis 17%.

Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
« 1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |
1
Christian 03.09.2009, 14:25:26
Unter http://forum.adventure-php-framework.org/en/viewtopic.php?f=10&t=26 findet sich ein weiterer Benchmark, der die gute Symbiose aus Performance und Erweiterbarkeit des APF unterstreicht.