marioff
este ma napadlo, s pohladom na vykon, neustale zapinanie a vypinanie parsera (ci ako sa to vola), teda <?=?>, neubere, aj ked cisto len teoreticky nieco z vykonu zeleza?
Kdysi jsem si myslívával, že se to takhle děje, ale ne. Parser se pořád nevypíná a nezapíná – PHP kód se zpracovává dvou stupňově, tzn. že nejdříve projde zdrojový soubor lexikální analýzou[1] a poté syntaktickou analýzou[2], kdy se vytvoří AST[3] a ten se poté zkompiluje do bytekódu. Na každém slušném hostingu je navíc extenze, která bytekód kešuje (APC, eAccelerator). Takže fáze lexikální a syntaktické analýzy odpadají.
Jelikož se vložené HTML (inline HTML) zkompiluje stejně jako echo – viz [4] a [5]+[6] –, je ouplně jedno, co člověk použije – mezi těmito dvěma kódy není žádný rozdíl:
<?php echo 'hello, world!';
hello, world!
Z pohledu interpretu (virtuální mašinky) tedy podle mě není rozdíl ve vytisknutí řetězce a ve vložení HTML. Je ale potřeba brát v potaz, že příklady nahoře nejsou úplně stejné. Opkódy by mohly vypadat nějak takto (odkoukávám z [9]):
ECHO '<div class="text">'
ZÍSKEJ_PROMĚNNOU $1, 'sekce'
ZÍSKEJ_INDEX_POLE $2, $1, 'text'
ECHO $2
ECHO '</div>'
a
ULOŽ_DO_PROMĚNNÉ $1, '<div class="text">'
ZÍSKEJ_PROMENNOU $2, 'text'
SPOJ_ŘETĚZCE $3, $1, $2
ZÍSKEJ_PROMĚNNOU $4, '</div>'
SPOJ_ŘETĚZCE $5, $3, $4
ECHO $5
Jestliže člověk bude všechny výsledky spojovat do jedné proměnné, budou převažovat instrukce spojování řetězce; jinak, a to jak v případě inline HTML, tak vypisování mezivýsledků rovnou a ne jejich spojování, budou převažovat ECHO instrukce. Myslím, že ECHO instrukce bude náročnější než spojování řetězce, protože její výkonný kód nejdříve musí zjistit, jestli se nekešuje výstup – v tom případě je to prakticky to samé jako instrukce spojování řetězců – a jestli ne, tak poslat řetězec na výstup (do stdout, když PHP běží jako CGI, nebo zavoláním nějaké Apachí API fce (asi), když PHP běží jako modul Apache).
Ale nepíšeme snad v assembleru, abychom optimalizovali každou instrukci, ne? ;-)
To byla teorie – teď benchmarky[7]+[8]. U mě (PHP 5.3.1) ukazují srovnatelné výsledky – někdy je rychlejší echo, někdy vložené HTML; což je nejspíše zapříčiněno tím, kolik procesorového času zrovna scheduler procesu PHP interpretu dá.
[1] http://en.wikipedia.org/wiki/Lexical_analysis
[2] http://en.wikipedia.org/wiki/Syntactic_analysis
[3] http://en.wikipedia.org/wiki/Abstract_syntax_tree
[4] http://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L246
[5] http://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L245
[6] http://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L565-567
[7] http://github.com/jakubkulhan/benchmarks/tree/master/echo-vs-embed/
[8] http://github.com/jakubkulhan/benchmarks/tree/master/echo-vs-embed-using-exec/
[9] http://derickrethans.nl/talks/internals.pdf