PHP Schleife anzeigen wie weit sie gerade ist

chrisi01

Romy lieb haben
ID: 101113
L
26 November 2008
2.854
238
hi

eins vorweg was ich hier beschreibe soll nie funktionsfähig eingesetzt werden sondern ist nur dazu gedacht etwas zu probieren ;) Ich weiß das man so was normalerweise nie umsetzen würde aber ich will damit was ausprobieren. Das ganze wird nur lokal auf meinen Rechner ausgeführt

So nun zum eigentlichen:

Nehmen wir an ich hab eine Schleife etwa 10.000.000 durchlaufen. Jetzt hätte ich gern eine aktuelle anzeige wie oft die Schleife gerade pro Sekunde durch läuft (das Script wird am Ende einige Minuten bis Stunden laufen aktuell schätze ich etwa gut 10.000 Durchläufe pro Sekunde)

PHP:
$izeit = 0;
$i = 0;
$zeit = time();
while ($i < 10000000)
{
mach_irgendwas_was_rechenaufwendig_ist();
if ($zeit != time())
{
  $izeit = 0;
  $zeit = time();
}
$i++;
$izeit++;
}

klar ich hab in $izeit nun stehen wie oft die Schleife pro Sekunde läuft (zumindest grob) nun würde ich das aber gerne Live angezeigt bekommen gibt es dafür eine Möglichkeit? Ideen? Wenn irgendwie Möglich möchte ich nicht unbedingt ständig das Script sich selbst neu aufrufen lassen was ja mal die "einfachste" Möglichkeit wäre.

Falls alles nix hilft werde ich wohl sekündlich $izeit in eine db schreiben und mir mit nem extra Script anzeigen lassen aber recht gefallen tut es mir nicht ;)

Danke schon mal für Ideen

mfg

Chris
 
Ganz normal messen halt:
PHP:
$s = microtime(true);
// ....
$e = microtime(true);
$diff = $e - $s;
Wenn 1 Iteration in $diff Sekunden durchläuft, dann laufen pro Sekunde logischerweise $diff[sup]-1[/sup] Iterationen durch.

Problem is die Ausgabe:
Läuft das über einen Webserver, kriegst du die Ausgaben ne halbe Minute später, wos dich eh nimmer interessiert, weil der natürlich die Ausgabe cacht, selbst, wenn du mit flush() arbeitest.
Läufst du normal von der Konsole kannst du live während der Arbeit ausgeben.

Alternativ wenn dus nicht live brauchst, dann schreib nach x Iterationen die Durchschnittsgeschwindigkeit in ein Log und werte es später aus.
 
Zuletzt bearbeitet:
hi

das zählen habe ich ja schon integriert in meinen Beispiel oben.

Mir geht es eben um das live anzeigen ;) Aber ich glaub in die db schreiben und extra auswerten dürfte das beste sein ;)

Werde es dann so bauen:

PHP:
<?
set_time_limit(0);
mysql_connect("localhost","root","lalala");
mysql_select_db("tab");
$zeit = time(); 
$i = 0;
while ($i < 99999999)
{
if ($zeit != time())
{
  $eintrag = "UPDATE zahler SET i = '$i', sek = '$izeit' WHERE id = '0'";
  $eintragen = mysql_query($eintrag);
  $izeit = 0;
  $zeit = time();
} 
rechenintensivermist();
$i++;
$izeit++; 
}

und zum auswerten dieses Script:

PHP:
<?
set_time_limit(0);
mysql_connect("localhost","root","lalala");
mysql_select_db("tab");

$abfrage = "SELECT i, sek FROM zahler WHERE id = '0'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
    echo 'Wir sind bei '.$row->i.' Datensaetze und haben aktuell '.$row->sek.' Inserts/Sekunde';
}
?>
<meta http-equiv="refresh" content="1; URL=auswerten.php" />

zwar nicht so schön aber klappt wunderbar :)

mfg

Chris
 
Nimm das Dateisystem. Warum die DB bemühen, die nimmt auch nur das Dateisystem plus Overhead. Selbst wenn sies im Speicher hält, wird imo der Overhead größer sein, als es gleich selber zu machen.

P.S. Deine Konstruktion String-ID mit "hole maximal Datensatz und iteriere solange es Datensätze gibt" hab ich ja mal übersehen :evil: :roll: (auch wenns nur ein Test is, sowas darf nicht passieren)
 
Nimm das Dateisystem. Warum die DB bemühen, die nimmt auch nur das Dateisystem plus Overhead. Selbst wenn sies im Speicher hält, wird imo der Overhead größer sein, als es gleich selber zu machen.

im Moment recht es so aber vllt. werde ich es nochmal mit Dateisystem testen. Wobei bei etwa 16.000 Querys/sek aktuell das eine mehr auch nix mehr ausmacht ;) meine Schätzung mit 10k war oben sehr gut ;)

P.S. Deine Konstruktion String-ID mit "hole maximal Datensatz und iteriere solange es Datensätze gibt" hab ich ja mal übersehen (auch wenns nur ein Test is, sowas darf nicht passieren)

wenn ich es richtig verstehe meinst du das:

PHP:
$abfrage = "SELECT i, sek FROM zahler WHERE id = '0'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
    echo 'Wir sind bei '.$row->i.' Datensaetze und haben aktuell '.$row->sek.' Inserts/Sekunde';
}

ich hole einen Datensatz und lass es in einer Schleife rennen :mrgreen: Klar unnötig aber eben auf die schnelle von Schattenbaum kopiert :biggrin:

mfg

chris
 
Wenn es nur darum geht, die maximale Anzahl an Iterationen zu messen, dann wäre meine Variante untenstehende. Zwei kleine Fehler gibt es dann nur noch, es wird ein Fatal Error erzeugt und sie ist nicht reproduzierbar.

PHP:
function countIteration()
{
    global $i;
    echo $i;
}

register_shutdown_function('countIteration');
ini_set('max_execution_time', 1);

$i = 0;
while(true)
{
    ++$i;
}
 
Hm alles gut und schoen, was ich immer noch am liebsten hab' is ein Javascript das funktionen aufruft. Das ganze nennt sich HTTP-Streaming und funktioniert recht gut (solange man nicht stundenlang die connection offenhaelt und alle paar ms ein update rauspusht.

https://bit.ly/NvO8k