[PHP] Verschillend Als-Dan statements

Pagina: 1
Acties:

Onderwerpen


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Ik heb een vraagje. Je kunt een Als-Dan statement op verschillende manieren maken. Alleen vroeg ik me of er nou nog veel verschil in parse-time zit tussen die verschillende manieren, als je één specifieke manier als standaard houdt in je hele applicatie. Zo op het oog lijkt me statement 3 de snelste, maar dat is puur omdat ie op 1 regel staat. Wie kan me er wat meer over vertellen ?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Statement 1
if ($x == "blaat") 
{
      $y = "loei";
} 
else 
{
      $y = "miauw";
}

// Statement 2
switch ($x)
{
      case "blaat": $y = "loei"; break;
      default: $y = "miauw"; break;
}

// Statement 3
$x == "blaat" ? $y = "loei" : $y = "miauw";

[ Voor 10% gewijzigd door wustenveld op 10-09-2003 09:34 ]


  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Gooi er een timer op? En ik noem dit meestal if-statements :D

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Een timer kan wel maar zou in het geval van mijn voorbeeld de verschillen niet zo klein kunnen zijn dat je op een timer geen verschillen ziet? En dat als je het door een gehele applicatie concequent gebruikt wel een verschil oplevert?

If statement kan natuurlijk ook, what's in a name :+

[ Voor 11% gewijzigd door wustenveld op 10-09-2003 09:42 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

wustenveld schreef op 10 september 2003 @ 09:34:
PHP:
1
2
// Statement 3
$x == "blaat" ? $y = "loei" : $y = "miauw";
ik doe dat in zulke gevallen altijd zo:
PHP:
1
2
// Statement 3
$y = ($x == "blaat")?"loei" : "miauw";

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Timen doe je normaal door je te timen onderdeel een paar 1000 keer uit te voeren.

MAAR

de efficientie van je applicatie af laten hangen van dit soort keuzes is de grootst mogenlijke onzin. De keuze tussen dit soort constructies hangt af van de leesbaarheid van je code.

Over het algemeen is if else toereikend. ZOdra je echter meer keuzes hebt is een case overzichtelijker. En soms (heel soms) moet je heel kort een keuze maken in een parameter en zou je de laatste kunnen overwegen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
De applicatie is al een heel stuk geschreven, en omdat ik het op dit moment rustig heb ben ik de core aan het optimaliseren danwel verbeteren. Ik probeer op allerlei plekken m'n code te verkorten, en dan toch eenzelfde resultaat te krijgen. En ik betrap mezelf er op dat ik soms if-then-else gebruik, dan weer een case en dan weer een parameter.

Zelf lijkt het me mooier om altijd eenzelfde methode te gebruiken, de uitkomst is in alle gevallen gelijk. En omdat ik nu toch bezig ben vroeg ik me af welke keuze sneller is.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verkorten!=Sneller (niet altijd dan)

En die statement 3 vind ik veel minder lekker lezen dan een normale if else constructie.

En switch leest pas lekkerder als je meer dan 1 voorwaarde hebt.

Maar hoe iets leest is natuurlijk subjectief. Alhoewel ik vaker heb gehoord dat iemand statement 3 niet mooi vind. Dus ook als je code onderhouden moet worden door iemand, zou ik gaan voor leesbaarheid.

[ Voor 4% gewijzigd door Voutloos op 10-09-2003 10:04 . Reden: Zie Username ]

{signature}


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Voutloos schreef op 10 September 2003 @ 10:04:
Verkorten!=Sneller (niet altijd dan)

En die statement 3 vind ik veel minder lekker lezen dan een normale if else constructie.

En switch leest pas lekkerder als je meer dan 1 voorwaarde hebt.

Maar hoe iets leest is natuurlijk subjectief. Alhoewel ik vaker heb gehoord dat iemand statement 3 niet mooi vind. Dus ook als je code onderhouden moet worden door iemand, zou ik gaan voor leesbaarheid.
die 3de gebruik ik omdat dat veel, en dan vooral in situaties als:
PHP:
1
$var = (isset($_GET['var'])?$_GET['var']:'default');

gewoon omdat ik dat veel duidelijk vind dan voor zo'n simpele bewerking een comleet if-statement neer te zetten.
maar zoals die in de TS stond gebruik ik hem niet, want dan is die idd er onduidelijk.

Verwijderd

Installeer eens een profiler. Daarmee kun je zien waar de bottlenecks in je php script zitten.

- APD ( pear install apd ) - http://pear.php.net
- xdebug - http://xdebug.derickrethans.nl/
- Zend Studio 3.0 heeft een profiler

Verwijderd

Overigens, laat je niet van de wijs brengen door korte of lange syntax.

Statement 1 genereert 9 opcodes..
Statement 2 genereert 17 opcodes..
Statement 3 genereert 12 opcodes..

Nu hoeft dit niets te zeggen over performance (statement 2 kan best het snelste zijn, bij uitvoer), maar houdt toch maar ingedachten dat minder opcodes over het algemeen goed is.

Het allerbelangrijkste is dat jij je code goed kunt lezen. Als je echt tegen bottlenecks aan loopt kun je met een profiler (zoals eerder genoemd) de problematische code opzoeken. Mocht je niets vinden met een profiler dan is het misschien tijd om je systeem eens te onderzoeken op performance bottlenecks (een onjuiste mysql configuratie is dodelijk voor performance).

Verder zijn Zend Optimizer of PHP Accelerator en APC (vanaf versie 2 ook optimalisatie passes!) natuurlijk ook erg interessant bij een script dat optimaal moet performen.

[ Voor 11% gewijzigd door Verwijderd op 10-09-2003 10:32 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op 10 September 2003 @ 10:31:
Statement 1 genereert 9 opcodes..
Statement 2 genereert 17 opcodes..
Statement 3 genereert 12 opcodes..
Stomme vraag misschien hoor, maar waar haal jij dit vandaan?
Of is dit de info die zo'n profiler geeft?

Update:
Dankje!

[ Voor 5% gewijzigd door Voutloos op 10-09-2003 12:04 ]

{signature}


Verwijderd

Vulcan Logic Disassembler: Te vinden op derickrethans.nl

Profiler geef info als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Stack-Dump Profile (sorted by execution time)
-----------------------------------------------------------------------------------
Time Taken    Number of Calls    Function Name    Location
-----------------------------------------------------------------------------------
  -> 0.0017009974    1    *stadsdeelcollectie::getallselectoptions    /work/websites/sandbox/XXXXXXXXXXXXXXXX/trunk/site/search.php:31
    -> 0.0016210079    1    *mysql_retrieve_as_assoc    /work/websites/sandbox/XXXXXXXXXXXXXXXX/trunk/site/library/MetaData.classes.php:48
-KNIP-
-----------------------------------------------------------------------------------
Opcode Compiling:                             0.0055620670
Function Execution:     0.0017009974
Ambient Code Execution: 0.0002679825
Total Execution:                              0.0019689798
-----------------------------------------------------------------------------------
Total Processing:                             0.0075310469
-----------------------------------------------------------------------------------


Sorry, voor brakke layout.. originele tekst ziet er een stuk beter uit ;-)

[ Voor 92% gewijzigd door Verwijderd op 10-09-2003 11:35 ]

Pagina: 1