microtime()

Hallo,

ich habe ein Verhalten von IPS, das ich nicht so recht nachvollziehen kann, mag sein dass ich gerade voll auf dem Schlauch stehe.

Ich habe ein miniscript, welches eine Datei ausliest. Davor und danach habe ich microtime(true) stehen.

Egal, wie oft ich auch das Script aufrufe, die erste microtime ist NIE mit vier Nachkommastellen, die Zweite ist es IMMER.

Kann mir da jemand ne Erklärung für geben?


	$path = IPS_GetKernelDir() . "/scripts/";
	$pre = "test_read_speed_";
	$file = "klein.txt";
	$file = "gross.txt";
//	$file = "mini.txt";

	$filename = $path . $pre . $file;
	
	$a = microtime(true);

	file_get_contents( $filename );

	$b = microtime(true);

	printf( "%-35.10d
", ($a ) );
	echo $b . "
";
	echo $b - $a . "
";
	echo $b - $a . "
";

	var_dump( $a, $b);

Steht das ‚d‘ in deinm printf Befehl nicht für eine Ausgabe als Integer?
Ich weiss es auch nicht so genau auswendig, aber das könnte es sein.

Gruß
Smudo

Nein, am Format liegt’s nicht (ist aber ein guter Hinweis).

Ich hebe ja auf die Werte ab, die var_dump() zurück liefert.

Und da ist, egal wie oft ich das mini-Ding auch laufen lasse, $a IMMER 1, 2 oder 3 Stellig, während $b IMMER 4-stellig ist.

Und das macht mich stutzig…

jwka

Hi,
Dein Skript liest ja bisher nur die grosse Datei (denke Du wolltest eigentlich nen Vergleich machen).

Ich habe in Deinem Code mal Debug Output eingebaut:

<?
   $path = IPS_GetKernelDir() . "/scripts/";
    $pre = "test_read_speed_";
    $file = "klein.txt";
    $file = "gross.txt";
//    $file = "mini.txt";

    $filename = $path . $pre . $file;
echo $filename;
// C:\IP-Symcon\/scripts/test_read_speed_gross.txt
// $filename = "C:\IP-Symcon\scripts	est_read_speed_gross.txt";

    $a = microtime(true);

    file_get_contents( $filename );

    $b = microtime(true);
	 echo "Printfs a then b:
";

    printf( "%-35.10d
", ($a ) );
    printf( "%-35.10d
", ($b ) );

    echo "Echo a then b:
";

    echo $a . "
";
	 echo $b . "
";

    echo "b-a then b-a again
";

	 echo $b - $a . "
";
    echo $b - $a . "
";

echo "var_dump follows: 
";
    var_dump( $a, $b);
?>

Mein Output:

C:\IP-Symcon\/scripts/test_read_speed_gross.txtPrintfs a then b:
1296157186                         
1296157186                         
Echo a then b:
1296157186.0361
1296157186.0368
b-a then b-a again
0.00061988830566406
0.00061988830566406
var_dump follows: 
float(1296157186.0361)
float(1296157186.0368)

Ich finde die ausgegebenen Werte plausibel und einen Unterschied in den Nachkommastellen gibt es so auch nicht.

Verhält sich das bei Dir anders (ich hab mit #1840 getestet)?

Die für den Test verwendeten Dateien kann ich Dir gerne geben, so dass wir das Verhalten abgleichen können.

Grüße, Benjamin

Interessante Seite :

Befehlsverzeichnis - Zeichenketten - printf() Ab PHP-Version 3 auf PHP4-Forum

Irgendwas scheint printf zu formatieren. Sonst füg doch noch ein Echo auf Variable a ein. Bei mir kommen dann beide mit 4x Nachkomma.

Habe aber nur mal gespielt, weiss nicht genau, was ich da tue und ob es weiterhilft. :smiley:

Gruß
Bruno

Hi Powerfreddy,
ja der gleiche Wert beim Printf erklärt sich durch das %d und ggf. der Erklärung aus PHP: Fließkommazahlen - Manual (roter Kasten).

Ich dachte es geht um den realen Unterschied und hatte deswegen den Test gemacht, da jwka ja keine Ergebnisse seines Scipts geschrieben hatte.

Grüße, Benjamin

Hallo Benjamin,

habe zu langsam getippt, Du warst schneller und ausführlicher mit Deinem Test. :smiley:

Habe es erst jetzt gesehen. Wobei die Erkenntnis aber glaube ich die gleiche ist: printf (bzw. die Zusatzangaben) ist der Unterschied/Übeltäter.

Gruß
Bruno

Hallo Bruno,

ich hatte den Post von jwka vermutlich nicht richtig eingeordnet oder verstanden und Formatprobleme ausgeschlossen bei meinen Tests (auf Grund seiner Antwort dazu) und nur reale Werte verglichen.

Das es Doch ein Formatproblem sein muss klang nach Deinem Post und 2-maligem lesen des Urspungsposts doch sehr plausibel und ich vermute darum gings eigentlich auch! :smiley:

Danke und Viele Grüße, Benjamin

Hallo und Danke für Euren Input!

@Bengie: Bitte nicht sosehr auf meinen Code sehen - es geht mir nur um die erzeugten Werte von microtime(). Das, was zwischen den beiden Zeilen steht, ist nur, damit ein „Abstand“ erzeugt wird, der vom System abhängig und damit stochastisch sein sollte (eine Zählschleife wäre mir „zu stabil“ gewesen, das Lesen einer Datei ist .a. abhängig von der System-Belastung).

Bitte vergesst mal für diese Diskussion die printf() Zeilen und betrachtet nur die Ausgabe von var_dump():

Im Kern ging mir es mir darum, dass auf meinem System (#1840) egal, wie oft ich das Script auch aufgerufen habe, beim ersten Wert ($a) NIE ein vierstelliger Nachkomma-Wert zustande kam, während er bei der zweiten ($b) IMMER vierstellig war.

Ich hätte das so erwartet, dass beide Werte völlig zufällig mal weniger, mal mehr Nachkommastellen haben müsste, abhängig eben vom System.

da das aber NICHT der Fall ist, habe ich einen systematischen - ich will es jetzt nicht Fehler nennen, sondern neutral „Punkt“ - vermutet wie z.B. dass Scripte seitens IPS immer nur zu fixen Millisekunden gestartet werden oder sowas. Das würde erklären können, warum der erste Wert IMMER höchstens dreistellig ist bei mir.

Denn nach Wahrscheinlichkeit müsste doch auch in $a gelegentlich ein vierstelliger Nachkommawert drinstehen, wenn er in $b solche Werte annimmt?

Ich hoffe, dass ich da jetzt klarer rüber gekommen bin.

Kann jemand vielleicht einfach das Skript ein paar mal laufen lassen, und die letzten beiden Zeilen der Ausgabe beobachten?

Danke
jwka

Bei meinem test vierstellig. Win XP.

float(1296225210.5781)
float(1296225211.4289)

@Paresy:
Danke.

Habe jetzt mal ne Schleife drumrum gebaut und das ein paar Hundert mal laufen lassen. Damit kann ich Entwarnung geben. Es treten nun auch vierstellige Nachkommas beim ersten Wert ($a) auf.

AAABER: Wenn ich das Script aus dem Editor per "Ausführen laufen lasse (ohne loop) dann kommen tatsächlich höchstens dreistellige Werte für $a, während für $b „alles“ (1-4stellig) vorkommt. Hab’s bestimmt 200 mal geklickt, weil ich es nicht glauben konnte, dass bei allen anderen Leuten 4-Stellen bei $a kommen, aber bei mir nicht …

Seltsam, aber lassen wir’s gut sein …

Danke an Alle!
jwka

Dieser Code.


$i=1;

//for( $i=1 ; $i < 200 ; $i++ )
//{

	$path = IPS_GetKernelDir() . "/scripts/";
	$pre = "test_read_speed_";
	$smallfile = "klein.txt";
	$bigfile = "gross.txt";
//	$file = "mini.txt";



	$filename = $path . $pre . $bigfile;
	
	$a = microtime(true);

	file_get_contents( $filename );

	$filename = $path . $pre . $smallfile;
	file_get_contents( $filename );

	$b = microtime(true);

	echo ".. 
";
	var_dump( $a);
	var_dump( $b);
//};



1296257065
1296257065.676
0.0011410713195801
0.0011410713195801
float(1296257065.6748)
float(1296257065.676)

die Ausführung danach:
1296257166
1296257166.5413
0.0012478828430176
0.0012478828430176
float(1296257166.54)
float(1296257166.5413)