Performance-Witz: Zend schneller als einfaches echo

ZodiacXP

Erfahrenes Mitglied
Servus.

Ich spiel momentan mit Zend rum und wollte mir die Performance einmal ansehen. Hierzu nutzte ich den bei Apache HTTPD mitgelieferten Apache Benchmark und bekam merkwürdige Ergebnisse (gekürzt aufs wesentliche):

Zend (1000 Aufrufe):
Code:
Time taken for tests:   2.475 seconds

Total transferred:      446000 bytes
HTML transferred:       235000 bytes

Time per request:       2.475 [ms]
Transfer rate:          175.98 [Kbytes/sec] received

Selber Inhalt per echo (1000 Aufrufe):
Code:
Time taken for tests:   3.220 seconds

Total transferred:      372000 bytes
HTML transferred:       235000 bytes

Time per request:       3.220 [ms]
Transfer rate:          133.55 [Kbytes/sec] received

Ja, spinn ich? Habs mehrere male getestet und Zend ist immer bis zu 1 ms schneller pro Aufruf als ein stinknormales echo vom selben Dokumenten-Body. Selbst wenn die Daten vom echo gezipped rausgehen. Zudem wird bei Zend noch einiges im Header dazu getan.

Wodran kann es liegen dass Zend immer ein Tacken schneller ist?

P.S. : Selbst bei 10.000 Requests bleibt das Verhältnis so.
 
Zuletzt bearbeitet:
Das ist völlig normal, es kommt ja auch immer darauf an, wie die Datei über "echo" ausgegeben werden soll, wie viele Abfragen und Kram da noch im Header steckt. Beim PHP wird es geparst, beim Zend (teilweise) als Binärdatei im Cache gehalten
 
Welche Datei? Per echo wird keine Datei ausgegeben sondern der rohe Dokumenten-Body den auch Zend kreiert.

Es kann nicht normal seien, dass das Zend-Framework mit dem laden mehrerer Klassen und erstellen einiger Objekte schneller ist als die direkte Ausgabe per echo.
Das Zend-Framework läuft innerhalb von PHP und ist trotzdem schneller als ein "echo"?
 
Zuletzt bearbeitet:
Worauf bofh1337 anspielt, ist jenes:

PHP-Skripte werden nicht als solches ausgeführt, sondern sie müssen erst eingelesen und geparst werden, dann in etwas Ausführbares übersetzt(bytecode)...dies alleine erfordert bereits Zeit.

Wenn Zend jetzt diesen bytecode cached, legt es Selbigen im Arbeitspeicher ab....und er kann beim nächsten Bedarf direkt ausgeführt werden, ohne die genannten Vorbereitungen(alleine die Tatsache, dass die PHP-Skripte auf der langsamen Festplatte liegen, und der bytecode im RAM, dürfte schon klarmachen, dass das Tempo keine Zauberei ist)

Interessant in diesem Zusammenhang ist vielleicht auch HipHop for PHP
 
Ok. Da rutscht hier ein kleines Missverständnis in das Thema. Sowohl das Zend-Framework als auch das einfache echo laufen auf dem Apache httpd und PHP.

Zum einen wird eine Instanz von Zend_Controller_Front geholt, diese mit einer Konfiguration gefüttert und in dem Controller IndexController wird auf den View für den Index zugegriffen und mit einer (ersetzten) Template-Variablen ausgegeben.
Zum anderen wird nichts gemacht außer der HTML-Quelltext stumpf per echo ausgegeben.

Das PHP das ganze parst ist mir bewusst. Mir ist allerdings weiterhin suspekt warum das laden und durchlaufen von so vielen Klassen in allen Tests schneller ist als ein simples echo.
Am Ende macht Zend_Controller_Front::dispatch bzw. Zend_Controller_Response_Abstract::outputBody() auch nur ein stumpfes echo vom Inhalt.
 
Es heisst ja nicht umsonst "Zend optimiert den PHP-Code".
Wenn das Zend schneller als die normale Ausgabe ist, heisst das doch nur, das der Code vom Zend optimiert wurde
 
Ok. Genau hier kommt meine Frage wieder auf: Wie kann ein komplexes Framework den Code dermaßen optimieren, das es ein einfaches "echo" vom selben Inhalt schlägt?

Da sind mehrere Zeilen PHP schneller als eine. Unfassbier.
 
Ok. Genau hier kommt meine Frage wieder auf: Wie kann ein komplexes Framework den Code dermaßen optimieren, das es ein einfaches "echo" vom selben Inhalt schlägt?

Da sind mehrere Zeilen PHP schneller als eine. Unfassbier.

Unfassbar ist es nicht:

Dieser Code:

PHP:
$var1 = "<table width=\"100\"><tr><td width=\"50\"></td></tr></table>";

echo "$var1";

Läuft langsamer als dieser:

PHP:
$var2 = '<table width="100"><tr><td width="50"></td></tr></table>';

echo $var2;

Das ist für mich alles eine Frage der Technik........keine Hexerei
 
Logisch! Mal ein Beispiel für dich:

Zend:

index.php
PHP:
function __autoload($class)
{
	require_once str_replace('_', '/', $class) . '.php';
}

$fc = Zend_Controller_Front::getInstance();

$fc->setControllerDirectory('application/controllers');
$fc->setParam('useDefaultControllerAlways', true);
$fc->setParam('noViewRenderer', false);
$fc->throwExceptions(true);
$fc->setParam('noErrorHandler', true);
$fc->dispatch();

IndexController.php
PHP:
class IndexController extends Zend_Controller_Action
{
	public function indexAction()
	{
		$view = $this->initView();
		$view->ausgabe = "moinsen";
	}
}

index.phtml
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<?php echo $this->ausgabe; ?>

</body>
</html>

===========

Simples echo
PHP:
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

Kann ja nicht Warstein!

</body>
</html>';

Alles ist selbstverständlich in das übliche <?php ?> eingefasst. Das ganze 1000 bzw 10.000 mal laufen lassen.

Variante über Zend: ca. 2,6ms
Variante mit einfachen echo: über 3,6ms

Das ist wirklich kein Mysterium, dass ein echo langsamer ist als das Framework, welches mehrere includes macht und somit noch mehr overhead haben müsst?
 
Hi,

das ist wirklich sehr eigenartig. Allerdings habe ich eine Erklärung dafür: echo im ZF-Beispiel gibt lediglich einen String von der Länge 7 Byte aus. Im Non-ZF-Beispiel sind es sehr viel mehr Zeichen, die ausgegeben werden müssen. Intern wird echo vermutlich ein Alias von printf() sein und muss dann intern natürlich für diese Größe zusätzlichen Speicher allokieren, was Zeit in Anspruch nimmt. Du solltest daher vielleicht eher so testen:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<?php
echo 'moinsen';
?>
</body>
</html>

Edit: Du kannst ja auch xdebug verwenden, und die grind-Files analysieren, um herauszufinden, was die "Performance-Engpässe" verursacht.
 
Zuletzt bearbeitet:
Zurück