Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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"

Skrevet (endret)

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
Skrevet

Ø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 :)

Skrevet
Ø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.

Skrevet

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.

Skrevet

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.

Skrevet (endret)
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
Skrevet (endret)

<?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
  • 3 uker senere...
Skrevet

Finnes det en måte for en metode å finne objektsnavnet den er kallt fra?

Altså noe ala dette:

class Class
{
function get_object_name()
{ // Print ut: osamaobjektet }
}

$osamaobjektet = new Class();

Skrevet

Er det noen som har eksperimentert med "kunstig" multi-threading i php? Finnes det noen skikkelig implementasjon av det? Å kjøre diverse php scripts via terminalen vha popen har litt for mange begrensnigner.

Skrevet
Er det noen som har eksperimentert med "kunstig" multi-threading i php? Finnes det noen skikkelig implementasjon av det? Å kjøre diverse php scripts via terminalen vha popen har litt for mange begrensnigner.

 

Hva med Ajax? :fun:

Skrevet

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.

Skrevet
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.

Skrevet
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.

Skrevet
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. :)

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å
×
×
  • Opprett ny...