Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

microtime() - Benchmark

3 views
Skip to first unread message

Johannes Mueller

unread,
Nov 27, 2004, 6:32:57 AM11/27/04
to
Mahlzeit NG,

ich hab mir mal in Minimalzeit sowas wie n Benchmark überlegt:

--code--
$start = microtime();
[..code..]
echo ((microtime()-$start)/1000);
--/code--

...aber mich beunruhigt, dass im Manual unter microtime() eine
ebensolche Benchmark-Funktion steht, die aber für mich schwer
nachzuvollziehen ist. ...deswegen meine Frage: ist mein Benchmark das
selbe nur "einfacher"? ...und wenn nein, was hab ich nicht bedacht?

Danke
Johannes

Hendrik Pilz

unread,
Nov 27, 2004, 7:02:34 AM11/27/04
to
http://de2.php.net/manual/en/function.microtime.php
this function returns the string "msec sec"

Das beachtest du bei deinem Benchmark nicht, du subtrahierst und
dividierst also mit einem String.

Gruß, Hendrik

Stephan Mann

unread,
Nov 27, 2004, 7:08:16 AM11/27/04
to

On 2004-11-27 12:32:57, Johannes Mueller wrote:
> $start = microtime();
> [..code..]
> echo ((microtime()-$start)/1000);
>
> ...aber mich beunruhigt, dass im Manual unter microtime() eine
> ebensolche Benchmark-Funktion steht, die aber für mich schwer
> nachzuvollziehen ist. ...deswegen meine Frage: ist mein Benchmark das
> selbe nur "einfacher"? ...und wenn nein, was hab ich nicht bedacht?

Lass dir mal ausgeben, was du von microtime() bekommst. Da ist ein
Leerzeichen drin. Damit zu rechnen wird dir nicht gelingen. Das Beispiel
im Manual nimmt deshalb diesen String auseinander. Alternativ kann man in
PHP5 mittels microtime(true) direkt einen Float-Wert bekommen, mit dem man
dan rechnen kann. Soweit der Manual-Vorlesedienst.

Aber warum benutzt du nicht einfach PEAR::Benchmark [0]?

hth, stephan
--
[0] http://pear.php.net/package/Benchmark

Marcel Hellkamp

unread,
Nov 28, 2004, 8:36:02 AM11/28/04
to
Stephan Mann wrote:
>
> On 2004-11-27 12:32:57, Johannes Mueller wrote:
>
>> $start = microtime();
>> [..code..]
>> echo ((microtime()-$start)/1000);
>>
>> ...aber mich beunruhigt, dass im Manual unter microtime() eine
>> ebensolche Benchmark-Funktion steht, die aber für mich schwer
>> nachzuvollziehen ist. ...deswegen meine Frage: ist mein Benchmark das
>> selbe nur "einfacher"? ...und wenn nein, was hab ich nicht bedacht?
>
> Lass dir mal ausgeben, was du von microtime() bekommst. Da ist ein
> Leerzeichen drin. Damit zu rechnen wird dir nicht gelingen. Das
> Beispiel im Manual nimmt deshalb diesen String auseinander. Alternativ
> kann man in PHP5 mittels microtime(true) direkt einen Float-Wert
> bekommen, mit dem man dan rechnen kann. Soweit der Manual-Vorlesedienst.


In PHP4 kann man das Ergebnis auch durch den Einzeiler
$time = array_sum(explode(" ", microtime()));
erreichen.

> Aber warum benutzt du nicht einfach PEAR::Benchmark [0]?

Weil er selbst das Beispiel bei PHP.net nicht kapiert hat und daher
bestimmt nicht so schnell durch die PEAR-Herachie durchsteigt.

Ich poste trotzdem mal meine Version einer Benchmark-Methode:

function timer($event = false) {
static $first, $last, $out;

$time = array_sum(explode(" ", microtime()));

if(!isset($first) OR $event === false)
$first = $time;
if(!$last OR $event === false)
$last = $time;
if($event === false)
return $out;

$out .= sprintf("Step:%8.4f Total:%8.4f [%s]\n",
($time - $last),
($time - $first),
$event);
$last = $time;
}

Anwendung:
Der Benchmark wird initiiert (auf 0 zurück gesetzt) durch 'timer();'
Nach jedem zu messenden Schritt muss 'timer('Beschreibung');' ausgeführt
werden. 'Beschreibung' kann eine Beschreibung des vorhergehenden
Abschnittes enthalten (darf nicht leer sein).
Am Schluss bekommt man mit 'echo timer();' die Statistik ausgegeben.
Dabei wird auch gleich der Timer auf 0 zurück gesetzt.

Die Ausgabe sieht in etwa so aus:
Step: 0.0001 Total: 0.0001 [SYS: INIT]
Step: 0.0016 Total: 0.0017 [SYS: Loading configurations]
Step: 0.0088 Total: 0.0105 [SYS: Open MySQL connection]
Step: 0.0075 Total: 0.0180 [SYS: Loading libraries]
Step: 0.0002 Total: 0.0182 [USR: User management]
Step: 0.0006 Total: 0.0188 [MOD: Module management]
Step: 0.0027 Total: 0.0215 [TPL: Template parsing]
Step: 0.0023 Total: 0.0238 [SYS: global.php]
Step: 0.0050 Total: 0.0288 [MOD: Modul execution]
Step: 0.0002 Total: 0.0290 [TPL: Output assignment]
Step: 0.0196 Total: 0.0486 [TPL: Rendering]

Ich find die Methode komfortabler als die PEAR-Alternative und setze sie
bei so gut wie allen meinen Projekten zum Testen des Laufzeitverhaltens
ein. Durch die static-variablen kann sie sogar innerhalb von Klassen und
Methoden oder includes eingefügt werden.

naja, vieleicht hilfts ja

mfg
Marcel Hellkamp

0 new messages