Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Det spørs jo. Jeg har aldri testet det ut i praksis, men echo/print skal visstnok utgjør litt hvis det er mange av de uten at man bruker output buffer. Grunnen til det er at det å skrive til webserver tar tid. Dog, det har jo i og for seg ingenting med hvorvidt mange "<?php ?>" er et problem. Sannsynligvis er det vel marginalt, iallfall i forhold til echo/print uten buffer, men nå ble jeg såpass nygjerrig at jeg må teste det ut litt :p

Lenke til kommentar
Videoannonse
Annonse

Flott, regner selvsagt med du poster resultatet her ;)

 

Har enda et spørsmål - hvordan er det når det kommer til såkalte «short tags»? Er det dumt å bruke? Vet selvsagt det om portabilitet, men jeg har bare støtt på en eneste server som ikke støttet dette, og da gjorde en htaccess-fil susen. Enkelt og greit.

 

Når jeg skriver kode som skal redistribueres bruker jeg selvsagt "the long way"

Lenke til kommentar

Jeg sjokkerer vel ingen hvis jeg sier at forskjellen er knapt målbar? Altså, på 100.000 linjer med "<?php $var = 1; ?>" bruker den ca260ms kontra ca200ms for "$var = 1;". Dvs. 0.6 µs pr. '<?php ?>'-par. Når jeg prøvde med «short tags» ble det derimot litt mer forskjell. Da var det plutselig 530ms, altså 3.3µs pr. '<? ?>'-par. Dog, ingen av delen er av særlig betydningsfull forskjell. Du skal ha ganske mange av de før de utgjør noen forskjell. Jeg ville vært mer bekymret for størrelsen på scriptet for å si det slik :)

 

Bare for å ha sagt det først som sist: Det er ingen perfekt test og det er fult mulig det finnes bedre metoder for å teste det ut, men jeg mener det illustrerer det faktum at forskjellen er særdeles liten. Det er også viktig å ikke se seg blind på at de totale forskjellene er store. Scriptene gjør aldeles ingenting, og måler essensielt hvor mye tid det tar å hente inn en 100.000 linjer lang fil og sette $var til 1 100.000 ganger. Størsteparten av tiden vil gå med på å faktisk hente inn og tolke den 100.000 linjer lange filen.

 

 

 

Kode for generering av test-filene:

<?php
$data = '';
for ($i=0; $i<100000; $i++)
 $data .= '<?php $var = 1; ?>'."\n";
file_put_contents('lot.php', $data);
for ($i=0; $i<100000; $i++)
 $data .= '<? $var = 1; ?>'."\n";
file_put_contents('shortLot.php', $data);
$data = '<?php'."\n";
for ($i=0; $i<100000; $i++)
 $data .= '$var = 1;'."\n";
file_put_contents('few.php', $data.'?>');

?>

 

Test med et sett '<?php ?>'

<?php
for ($i = 0; $i < 5; $i++)
{
 $start = microtime(true);
 include('few.php');
 $end = microtime(true);
 echo ($end-$start)."\n";
}
?>

 

Test med mange (<?php):

<?php
for ($i = 0; $i < 5; $i++)
{
 $start = microtime(true);
 include('lot.php');
 $end = microtime(true);
 echo ($end-$start)."\n";
}
?>

 

Test med mange (<?):

<?php
for ($i = 0; $i < 5; $i++)
{
 $start = microtime(true);
 include('shortLot.php');
 $end = microtime(true);
 echo ($end-$start)."\n";
}
?>

 

Endret av Ernie
Lenke til kommentar

Ønsker man å oppnå rask og effektiv kode er det helt feil å begynne med antall "<?php ?>", echo vs print eller om man skal bruke enkle vs doble hermetegn. Ingen av disse parametrene har innvirkning på effektiviteten - som Ernie poengterer: ytelseøkning på 60 millisekund ved 100 000 linjer er neglisjerbart.

 

Let heller etter antall løkker, da spesielt looper som kjører inni hverandre. Hvordan sorteres og hente ut data? Hva med å benytte en form for caching på enkelte deler av sciptet? Mye lurt som kan gjøres, først skritt blir å kartlegge hvilket deler av koden som tar lang tid :)

Lenke til kommentar
Ønsker man å oppnå rask og effektiv kode er det helt feil å begynne med antall "<?php ?>", echo vs print eller om man skal bruke enkle vs doble hermetegn. Ingen av disse parametrene har innvirkning på effektiviteten - som Ernie poengterer: ytelseøkning på 60 millisekund ved 100 000 linjer er neglisjerbart.

 

Helt enig. Størsteparten av tidsbruken i treigere script stammer heller fra antall og størrelse på SQL-spørringer, hvor mye fil-I/O som utføres og hvor mange includes du har. :) Godt gjennomtenkt bruk av SQL, gjerne med caching av resultatsett, ikke flere includes enn nødvendig, og minst mulig stor fil-I/O (større enn PHPs filcache) kan gjøre underverker for kjøretid, og det er ikke umulig å oppnå kjøretid på > 5ms på relativt omfattende programsystem.

Lenke til kommentar

Stemmer, men da snakker en om endringer en ikke kan gjennomføre om en skal f.eks. videredistribuere applikasjonene. Personlig har jeg ikke tatt meg tid til å sette det opp på lokal testserver fordi jeg vil "simulere" hvordan det kjører i worst-case.

Lenke til kommentar
Stemmer, men da snakker en om endringer en ikke kan gjennomføre om en skal f.eks. videredistribuere applikasjonene. Personlig har jeg ikke tatt meg tid til å sette det opp på lokal testserver fordi jeg vil "simulere" hvordan det kjører i worst-case.

Ja, det er jo klart, men det er jo noe brukere selv kan legge til på serveren. Hvis de kontrollerer den vel å merke.

 

Cacher PHP en kompilert utgave av skriptene automatisk, eller er det noe brukeren må gjøre selv? Jeg kan tenke meg det er litt å hente der hvis PHP kompilerer skriptet hver gang.

PHP «kompilerer» scriptet hver gang.

Endret av Ernie
Lenke til kommentar

<?php
interface A
{
public function test();
}
$var = new A()
{
public function test()
{
	echo 'YEY!';
}
}
$var->test();
?>

*savne støtte for anonyme (indre) klasser* Dvs., PHP støtter vel ikke indre klasser i det heltatt. Litt synd egnetlig, i og med at det har sine fordeler i forhold til OOP og ikke minst som «callback».

Endret av Ernie
Lenke til kommentar
  • 3 uker senere...
Hmm, pcntl så interessant ut, men det jeg manglet var egentlig de grunnleggende tingene man kan gjøre med tråder, som venting og utveksling av data osv., altså den oppførslen som i java.

Vel, PHP er ikke akkurat bygget for den type ting. Trenger man den type funksjonalitet så tror jeg Java vil være et svært mye bedre valg, men det er jo også litt avhengig av hva man skal ha utført også da såklart.

Lenke til kommentar
Hmm, pcntl så interessant ut, men det jeg manglet var egentlig de grunnleggende tingene man kan gjøre med tråder, som venting og utveksling av data osv., altså den oppførslen som i java.

Vel, PHP er ikke akkurat bygget for den type ting. Trenger man den type funksjonalitet så tror jeg Java vil være et svært mye bedre valg, men det er jo også litt avhengig av hva man skal ha utført også da såklart.

Jeg vet, men det hadde vært otrolig praktisk om PHP hadde innebygd trådestøtte. Men PHP er tross alt laget for å generere HTML som sendes av gårde, så jeg skjønner hvorfor ikke multithreading var prioritert, men vi kan jo krysse fingrene for PHP7.

Lenke til kommentar
Jeg vet, men det hadde vært otrolig praktisk om PHP hadde innebygd trådestøtte. Men PHP er tross alt laget for å generere HTML som sendes av gårde, så jeg skjønner hvorfor ikke multithreading var prioritert, men vi kan jo krysse fingrene for PHP7.

 

Slik ting har vært innad i Zend/PHP siden PHP5, ser det ut til at PHP7 == Java med PHPCompat-lib til. :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...