de.comp.lang.php.* FAQ

25.5. Wie kann ich die Performance zweier Befehle vergleichen?

Antwort von Martin Jansen

<?php
  function start_timer($event) {
    printf("timer: %s<br>\n", $event);
    list($low, $high) = explode(" ", microtime());
    $t = $high + $low;
    flush();

    return $t;
  }

  function next_timer($start, $event) {
    list($low, $high) = explode(" ", microtime());
    $t    = $high + $low;
    $used = $t - $start;
    printf("timer: %s (%8.4f)<br>\n", $event, $used);
    flush();

    return $t;
  }

  $t = start_timer("start Befehl 1");

  /* Hier den ersten Befehl einfuegen */

  $t = next_timer($t, "start Befehl 2");

  /* Hier den zweiten Befehl einfuegen */

  $t = next_timer($t, "finish");
?>

Möchte man zum Beispiel den Performance-Unterschied zwischen mysql_fetch_row und mysql_fetch_array bestimmen, fügt man die beiden Befehle an die beiden mit Kommentaren versehenen Stellen im Skript ein.

Antwort von Sebastian Bergmann

Eine Alternative zur oben dargestellten Methode der Performance Messung bieten die PEAR Klassen Benchmark_Timer und Benchmark_Iterate.

Die Benchmark_Timer Klasse stellt die benötigte Funktionalität zur Verfügung, um Marken zu setzen, und die zwischen zwei Marken verstrichene Zeit zu berechnen.

<?php
  // PEAR::Benchmark_Timer inkludieren
  require_once "Benchmark/Timer.php";

  // Timer Instanz erzeugen
  $Timer = new Benchmark_Timer;

  // Marke "Beginn For-Schleife" setzen
  $Timer->setMarker("Beginn For-Schleife");

  for ($i = 0; $i < 10000; $i++) { }

  // Marke "Ende For-Schleife" setzen
  $Timer->setMarker("Ende For-Schleife");

  // Zeit zwischen den beiden Marken berechnen
  print $Timer->timeElapsed("Beginn For-Schleife","Ende For-Schleife");
?>

Die Benchmark_Iterate Klasse leitet sich von der Benchmark_Timer Klasse ab und ermöglicht die wiederholte Ausführung einer Funktion, um so die mittlere Ausführungsgeschwindigkeit derselben zu ermitteln.

<?php
  // Funktion, die wir benchmarken wollen
  function foo()
  {
    print "bar<br>";
  }

  // PEAR::Benchmark_Iterate inkludieren
  require_once "Benchmark/Iterate.php";

  // Benchmark Instanz erzeugen
  $Benchmark = new Benchmark_Iterate;

  // Benchmark ausführen
  $Benchmark->run(100, "foo");

  // Ergebnis ausgeben
  $result = $Benchmark->get();
  print "Mittlere Ausführungsgeschwindigkeit: " . $result["mean"];
?>

Die run()-Methode erlaubt einen dritten (vierten, fünften, ...) Parameter, welcher der zu testenden Funktion als Argument übergeben wird.

Valid HTML 4.01! Valid CSS!

25.5. Wie kann ich die Performance zweier Befehle vergleichen?
http://www.php-faq.de/q/q-code-performance.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team