forum Sea of Sin / Startseite sitemap

Sea of Sin / Blog

Zentrum der Langeweile

Performance Array #1

2009/02/01 von de_henne
Da Performance immer ein aktuelles Thema ist und dies bei der Entwicklung immer mit einfließen sollte versuch ich in PHP immer mehr über das Verhalten herauszufinden. Welche Konstrukte fressen viel RAM, brauchen ewig und gibt es alternative Wege dafür?
In meinem Fall ging es darum, den ersten Eintrag eines Arrays abzuarbeiten.
Der Aufbau meines Arrays sah wie folgt aus:

  1. $array = array(
  2. 0 => array(
  3. '0' => true,
  4. '1' => true,
  5. '2' => true,
  6. '3' => true,
  7. '4' => true,
  8. '5' => true,
  9. '6' => true,
  10. '7' => true,
  11. '8' => true,
  12. '9' => true,
  13. '10' => true
  14. )
  15. );


Es gab einmal den direkt Weg

  1. foreach ($array[0] as $a_key => $a_val) {
  2. // somethin todo
  3. }

und einmal den Index 0 zwischenspeichern.

  1. $_r = $array[0];
  2. foreach ($_r as $a_key => $a_val) {
  3. // somethin todo
  4. }

Überraschenderweise war erster Weg der schnellere und in manchen Fällen fast doppelt so schnell.

Beide foreach Schleifen liefen jeweils 10.000 bis 100.000 mal durch.

Ergebnis 10.000x:
Dauer 1: 0.0490520000458 Sekunden
Dauer 2: 0.0724999904633 Sekunden

Ergebnis 100.000x:
Dauer 1: 0.49159693718 Sekunden
Dauer 2: 0.710182189941 Sekunden


Versteht mich nicht falsch, PHP Performance bringt nur was wenn auch die Datenbank steht. Größtes Problem bei datenbankgestützten Anwendungen ist die Datenbank selbst. Entweder die Verbindung zur Datenbank oder die Abfragen. Solche Performance Verbesserungen wie oben sind eher ein Tropfen auf dem heißen Stein.


Mein Testcode:
  1. <?php
  2.  
  3. $max = 100000;
  4.  
  5. $array = array(
  6. 0 => array(
  7. '0' => true,
  8. '1' => true,
  9. '2' => true,
  10. '3' => true,
  11. '4' => true,
  12. '5' => true,
  13. '6' => true,
  14. '7' => true,
  15. '8' => true,
  16. '9' => true,
  17. '10' => true
  18. )
  19. );
  20.  
  21.  
  22. $start1 = microtime(true);
  23. test1();
  24. $end1 = microtime(true);
  25. echo 'Dauer test1: '. ($end1-$start1) .' Sekunden<br>';
  26.  
  27.  
  28. $start2 = microtime(true);
  29. test2();
  30. $end2 = microtime(true);
  31. echo 'Dauer test2: '. ($end2-$start2) .' Sekunden<br>';
  32.  
  33.  
  34. function test1()
  35. {
  36. global $max, $array;
  37.  
  38. for ($i = 0; $i < $max; $i++)
  39. {
  40. // Testcode
  41. $_r = $array[0];
  42. foreach ($_r as $a_key => $a_val) {
  43. // somethin todo
  44. }
  45. }
  46. }
  47.  
  48. function test2()
  49. {
  50. global $max, $array;
  51.  
  52. for ($i = 0; $i < $max; $i++)
  53. {
  54. // Testcode
  55. foreach ($array[0] as $a_key => $a_val) {
  56. // somethin todo
  57. }
  58. }
  59. }
  60.  
  61. ?>
 

  • Keine Kommentare