Freitag, 1. Juni 2007

PHP

Schneller Schleifen in PHP

Wie man Schleifen in PHP schneller durchlaufen kann.

Dies ist der erste Eintrag aus der Reihe der 100 besten PHP Tips und Tricks. Ich habe mich zu dem Post mit der Schleife dazu entschieden, weil ich immer wieder in verschiedenen Scripten darüber stosse, wie man es nicht machen sollte.

Wie man in PHP Schleifen nicht machen sollte

Download Code!

  1.  
  2.  
  3. for($i = 0; $i < count($liste); $i++) {
  4.   // tue irgendwas
  5. }
  6.  
  7.  

Schnellere Schleifen - so ist es richtig:

Download Code!

  1.  
  2.  
  3. for($i = 0, $size = count($liste); $i < $size; ++$i) {
  4.   // tue irgendwas
  5. }
  6.  
  7.  

Worin liegt der Vorteil bei der zweiten Version der Schleife?

Zum einen verwenden wir eine Variable für die Größe der Liste/Arrays. Das ist die Variable $size. Die Größe des Arrays wird so in PHP nur ein einziges Mal abgefragt.

Zum anderen ist die Erhöhung des Zählers umgestellt worden. Er macht einen sogenannten Preincrement anstatt einen Postincrement. Der Preincrement mit ++$i ist wesentlich schneller als der Postincrement mit $i++.

Proof of the concept

Download Code!

  1.  
  2. $loops = 100000;
  3.  
  4. $start = microtime(true);
  5. for ($i = 0; $i < $loops; $i++) {
  6.        
  7. }
  8. $stop = microtime(true);
  9.  
  10. echo ($stop - $start)."\n";
  11.  
  12.  
  13. $start = microtime(true);
  14. for ($i = 0; $i < $loops; ++$i) {
  15.        
  16. }
  17. $stop = microtime(true);
  18.  
  19. echo ($stop - $start)."\n";
  20.  
  21. // Jetzt mit einem Array
  22.  
  23. $someArray = array(100);
  24.  
  25.  
  26. $start = microtime(true);
  27. for ($i = 0; $i < count($someArray); $i++) {
  28.        
  29. }
  30. $stop = microtime(true);
  31.  
  32. echo ($stop - $start)."\n";
  33.  
  34.  
  35. $start = microtime(true);
  36. for ($i = 0, $size = count($someArray); $i < $size; ++$i) {
  37.        
  38. }
  39. $stop = microtime(true);
  40.  
  41. echo ($stop - $start)."\n";
  42.  
0.89327216148376
0.90055012702942
5.1975250244141E-005
4.3869018554688E-005

Wenn ihr so die Schleifen in PHP baut sind sie um ein viellfaches schneller als in der ersten Variante.

Das ist der erste PHP-Tip aus der Serie der 100 PHP Tricks

Beweis - Preencrement funktioniert richtig.

Aufgrund der Aussage von Schlingel, welche nicht richtig ist, hier der Beweis für das korrekte Verhalten.

Download Code!

  1.  
  2. // Es soll eine Ausgabe von 0-2 produziert werden und bewiesen werden, dass die Zählung bei 0 beginnt.
  3. for($i = 0; $i < 3; ++$i) {
  4.         echo 'Counter ist auf: '.$i."\n";
  5.         assert($i == 0);
  6.        
  7. }
  8.  

Wie erwartet produziert die Scheife folgende Ausgabe:

Counter ist auf: 0
Counter ist auf: 1

Warning: assert() [function.assert]: Assertion failed in testPreencrement.php on line 5
Counter ist auf: 2
Warning: assert() [function.assert]: Assertion failed in testPreencrement.php on line 5
Bewertung: 3 von 5, 2 Stimme(n) 2524 Klicks
PHP
Von Mr.Foo in PHP am 01.06.07@01:06 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

PHP: Schnellere for-Schleifen
Gerade im Entwickler-Blog einen kleinen Tipp zur Optimierung von for-Schleifen gelesen. Die Idee ist nicht neu aber gut, jedoch wieviel bringt sie? Ein Benchmark wird es zeigen. Zuerst wird ein Array mit 1.000 Schlüsseln erzeugt und dann nochmal durch...
Weblog: michfrms Blog
Aufgenommen: Sep 24, 21:52

4 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

der Schlingel - #1 - 18.02.2008 13:16 - (Antwort)

Wobei hier nicht darauf vergessen werden darf, dass bei einem Preinkrementiervorgang auch die Variable in der Schleife schon beim ersten Durchgang 1 ist.

Das darf bei der Verarbeitung von Arrays nicht vergessen werden.

Mr. Foo - #1.1 - 18.02.2008 14:14 - (Antwort)

Hallo Schlingel,

deine Aussage ist nicht korrekt. Ein Proof Of The Concept habe ich oben eingefügt.

halbesbit - #2 - 28.04.2008 17:59 - (Antwort)

gibt es da tests bzw eine übersicht wegen der schelligkeit,und wenn woh ?

Mr. Foo - #2.1 - 28.04.2008 18:52 - (Antwort)

Ich habe zum Beweis ein Proof of the concept oben eingefügt.


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Schneller Schleifen in PHP

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen