Microtime() auf Windows? Womit sonst Zeitmessung?

Moin,

die Funktion microtime() funktioniert laut PHP-Handbuch nur auf Systemen, die gettimeofday() unterstützen. Gehört Windows dazu? Oder hängt es darüber hinaus noch von der Windows-Version oder vom Prozessor ab?

Also interpretiert werden beide Funktionen, aber der Mikrosekunden-Anteil ist Käse. Hinzu kommt, dass microtime(true) keinen Float liefert.

Klingt alles sehr nach Dummy-Implementation. Aber wie auch immer - ich würde gerne Zeiten messen, und das macht sich mit time() etwas blöd, weil es nur Sekunden auflöst. Gibt es da andere Möglichkeiten?

Mein System ist übrigens Windows98 auf einem 3000er AMD-Rechner.

Kristian

Also interpretiert werden beide Funktionen

Dann ist doch deine Frage schon beantwortet, oder?
Wenn kein Fehler ausgegeben wird Funktioniert microtime!!!

aber derMikrosekunden-Anteil ist Käse.

Mmmhhh… Käse.
Camenbert oder Gouda?
Ich ess jetz erstmal mein Edamer Brötchen.
Aber nun zurück zur Zeitmessung. Wie siehts hiermit aus:

$start=microtime();
//[...]
$ende=microtime();
echo "Seite in ".($ende-$start)." Microsekunden erstellt."

Dann ist doch deine Frage schon beantwortet, oder?

Nö.

Wenn kein Fehler ausgegeben wird Funktioniert microtime!!!

Fragt sich nur, wie gut.

aber derMikrosekunden-Anteil ist Käse.

Mmmhhh… Käse.
Camenbert oder Gouda?
Ich ess jetz erstmal mein Edamer Brötchen.

Maasdamer. Am Stück.

Aber nun zurück zur Zeitmessung. Wie siehts hiermit aus:

$start=microtime();

//[…]

$ende=microtime();

echo „Seite in „.($ende-$start).“ Microsekunden erstellt.“

Genau das spielt eben nicht, da der Mikro-Sekunden-Anteil Schrott ist.

Schrott? Wie meist du dass?

$start=microtime();

//[…]

$ende=microtime();

echo „Seite in „.($ende-$start).“ Microsekunden erstellt.“

Genau das spielt eben nicht, da der Mikro-Sekunden-Anteil
Schrott ist.

Sprich es kommen manschmal negtive Werte heraus?
Hab mal gegoogelt.
Es gibt anscheinend da tatsächlich ein paar Windows-Bugs
Mir fällt da nur der (unfeine) Tip ein: Posix Betribsystem nehmen statt Windows, also:
Linux, Unix oder MacOS.

Ist der PC ein reiner Server? Dann wäre ein Umstieg echt sinnvoll, da besonders Unix/Linux viele Systemtools hat die man in der Windows Welt bis heute vermisst.
Falls der AMD ein 64bit Prozessor ist, könnte man mit Linux auch die volle Rechenpower nutzen.

Was läuft sonst noch auf der Kiste? Wie viel RAM hat sie?

Falls mir was anderes einfällt poste ich es hier rein.

Sprich es kommen manschmal negtive Werte heraus?

Negativ nicht, nein, aber unsinnige und zu kurze, also z.B. nur drei- oder vierstellige Zahlen. Wenn ich die als Mikrosekunden zu den Sekunden hinzuaddiere, hat das auf den Endwert praktisch keinen Einfluss, und wenn ich dann subtrahiere, kommen quasi nur ganze Sekunden raus.

Hab mal gegoogelt.
Es gibt anscheinend da tatsächlich ein paar Windows-Bugs
Mir fällt da nur der (unfeine) Tip ein: Posix Betribsystem
nehmen statt Windows, also: Linux, Unix oder MacOS.
Ist der PC ein reiner Server? Dann wäre ein Umstieg echt sinnvoll

Nein, den Rechner nutze ich offline zur Projekt-Entwicklung. Laufen tut es dann bei einem Hoster, und der wird Linux haben, glaube ich. Da brauche ich das Feature dann aber gar nicht mehr unbedingt :wink:

Ohnehin … ich hab´s jetzt ohne Messung gemacht. Der Unterschied war so deutlich, dass es überflüssig wurde :smile:

Achso, ich verwende den WOS (Webserver on Stick) und das dortige PHP4. Bei PHP5 habe ich microtime noch nicht ausprobiert.

Kristian

Negativ nicht, nein, aber unsinnige und zu kurze, also z.B.
nur drei- oder vierstellige Zahlen. Wenn ich die als
Mikrosekunden zu den Sekunden hinzuaddiere,…

Wieso hinzuaddieren $ende-$start ist die Zeit in Microsekunden, zum laden der Seite. Die kann verdammt kurz sein.
($ende-$start)/1000 wäre die Zeit in Sekunden. (Die solltest du aber noch runden). Ein Wert von 0.00006 sek. ist nicht unüblich zum erstellen einer Seite.

Hoster:
Meistens setzen die Hoster auf Linux, weil 1. kostenlos, 2. besser konfigurierba und mehr domains gleichzeitig gehostet* werden können.

*=Frag nicht warum, hab ich irgendwann(irgendwo mal gelesen.

Hallo
Ich glaube, du hast ein Problem mit der Syntax. Hier ein Stück PHP-Manual:

microtime() gibt den aktuellen Unix Timestamp mit Mikrosekunden zurück. Diese Funktion steht nur auf Systemen zur Verfügung, die den Systemaufruf gettimeofday() unterstützen.

Wird diese Funktion ohne den optionalen Parameter aufgerufen, gibt diese die Zeichenkette „msec sec“ zurück. Dabei entspricht sec der aktuellen Zeit, ausgedrückt als Anzahl der Sekunden seit Beginn der UNIX-Epoche (0:00:00 January 1, 1970 GMT), msec stellt den Mikrosekunden-Teil dar. Beide Teile des Strings werden in Sekunden zurückgegen.

Wird get_as_float angegeben und als TRUE ausgewertet gibt microtime() eine Fließkommazahl (float) zurück.

Anmerkung: Der Parameter get_as_float wurde in PHP 5.0.0 eingeführt.

  1. Mit PHP4 kann auch mit Parameter kein Float herauskommen
  2. Auch der Millisekundenanteil wird in Sekunden ausgegeben

Da ganze Sekunden und Sekundenbruchteile getrennt ausgegeben werden, must du dir erst einen Float-Wert erzeugen, z.B.

eval('myfloat=' . strtr(microtime(),' ','+') . ';');
echo myfloat;

Hallo Johannes,

mit der Syntax sollte eigentlich alles stimmen (die zitierte Seite habe ich auch vorliegen). Das mit PHP4 und 5 stimmt allerdings, hatte das vergessen zu erwähnen, dass ich das mit Parameter nur unter 5 probiert habe.

Allerdings habe ich eben - glaube ich - den Fehler gefunden: Das blöde sleep() scheint Schuld zu sein! Was ich nicht gesehen hatte ist, dass der Parameter als Integer definiert ist. So ein Mist! Da das usleep() auf Windows nicht funktioniert, musste ich das andere nehmen aber meine Sekunden-Werte wurden immer auf ganze Zahlen abgerundet. Super …

Naja, ich werde das vielleicht nochmal mit einer Schleife versuchen, die zur Ausführung ewig braucht, um auch mal Komma-Sekunden hinzubekommen. Das hier war jedenfalls mein Test-Skript:

#######################################################################################


function mt2float($mt)
{
 list($usec, $sec) = explode(" ", $mt);
 return ((float)$usec + (float)$sec);
}

#######################################################################################


echo $delay\_sec;
echo '

     ';
    if (!isset($delay\_sec) or $delay\_sec == '') { $delay\_sec = 2.5; }
    echo 'Pause zwischen den jeweiligen Messungen: **' .$delay\_sec. "s** \n\n \n";
    
    ###############################################################
    
    $time\_start = microtime();
    #usleep($delay\_sec \* 1000000);
    sleep($delay\_sec);
    $time\_end = microtime();
    
    $time = mt2float($time\_end) - mt2float($time\_start);
    
    echo $time\_start. ' -- \> ' .mt2float($time\_start). "s\n" .
     $time\_end. ' -- \> ' .mt2float($time\_end). "s\n\n" .
     'Sekunden-Differenz: **' .$time. "s** (_microtime()_)\n\n ";
    
    ###############################################################
    
    $time\_start = microtime(true);
    #usleep($delay\_sec \* 1000000);
    sleep($delay\_sec);
    $time\_end = microtime(true);
    
    $time = $time\_end - $time\_start;
    
    echo $time\_start. "s\n" .
     $time\_end. "s\n\n" .
     'Sekunden-Differenz: **' .$time. "s** (_microtime(true)_)\n\n ";
    
    ###############################################################
    
    $time\_start = gettimeofday();
    print\_r($time\_start); echo "\n";
    #usleep($delay\_sec \* 1000000);
    sleep($delay\_sec);
    $time\_end = gettimeofday();
    print\_r($time\_end); echo "\n";
    echo 'Sekunden-Differenz: **' .(($time\_end['sec'] + ($time\_end['usec']/1000000)) -   
     ($time\_start['sec'] + ($time\_start['usec']/1000000))) .  
     "s** (_gettimeofday()_)\n\n ";
    
    ###############################################################


Kristian