Zeitberechnung
am 22.09.2006 11:05:47 von vicodas
Hi,
wieder einmal das leidige Thema Zeitberechnung.
ich möchte die Abarbeitungszeit einer http Abfrage messen.
Folgendes habe ich gemacht:
my $start = $:^T;
$req = HTTP::Request->new('GET', $url, $h);
my $stop = time;
my $duration = $stop - $start;
Ausgabe von $duration z.B.: 1158915894
nun möchte ich aber die Dauer in Sekunden haben,
Format 0,000000 sek.
Wie kann ich das anstellen, oder hat jemand eine andere Idee?
thx Karsten
Re: Zeitberechnung
am 22.09.2006 11:10:06 von Christian Lackas
* Karsten Schöke [2006-09-22]:
Hallo Karsten,
> ich möchte die Abarbeitungszeit einer http Abfrage messen.
> my $start = $:^T;
warum hier nicht auch time? Der Beginn der Abfrage und der Start des
Skriptes fallen ja nicht unbedingt immer zusammen.
Und wo kommt der Doppelpunkt her?
> $req = HTTP::Request->new('GET', $url, $h);
> my $stop = time;
> my $duration = $stop - $start;
> Ausgabe von $duration z.B.: 1158915894
Sollte eigentlich eher sowas im Bereich 0-60 sein, oder nicht?
> nun möchte ich aber die Dauer in Sekunden haben,
> Format 0,000000 sek.
Du bekommst die Dauer in Sekunden, allerdings ist die Genauigkeit auch
nur eine Sekunde (mit Nachkommastellen ist also nichts). Wenn du es
genauer messen möchtest, dann nimm doch Time::HiRes.
> Wie kann ich das anstellen, oder hat jemand eine andere Idee?
Falls das Formatieren das Problem sein sollte:
perldoc -f sprintf
y/./,/;
Gruß
Christian
--
No-one has yet built a monument so high that a bird can't fly over and
shit on it. (John McCarthy)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Zeitberechnung
am 22.09.2006 11:23:41 von Mirco Wahab
Thus spoke Karsten Schöke (on 2006-09-22 11:05):
> my $start = $:^T;
> $req = HTTP::Request->new('GET', $url, $h);
> my $stop = time;
> my $duration = $stop - $start;
>
> Ausgabe von $duration z.B.: 1158915894
> nun möchte ich aber die Dauer in Sekunden haben,
> Format 0,000000 sek.
> Wie kann ich das anstellen, oder hat jemand eine andere Idee?
Um Christians Gedanken fortzuführen,
ich nehme immer Time::Hires --
use Time::HiRes qw( gettimeofday tv_interval );
...
$t0 = [gettimeofday];
insert_code_to_time_here;
$t1 = [gettimeofday];
$t0_t1 = tv_interval $t0, $t1;
printf "%.6f", $t0_t1;
...
Viele Grüße
Mirco
Re: Zeitberechnung
am 22.09.2006 12:19:06 von hjp-usenet2
On 2006-09-22 09:23, Mirco Wahab wrote:
> Thus spoke Karsten Schöke (on 2006-09-22 11:05):
>
>> my $start = $:^T;
>> $req = HTTP::Request->new('GET', $url, $h);
>> my $stop = time;
>> my $duration = $stop - $start;
>>
>> Ausgabe von $duration z.B.: 1158915894
>> nun möchte ich aber die Dauer in Sekunden haben,
>> Format 0,000000 sek.
>> Wie kann ich das anstellen, oder hat jemand eine andere Idee?
>
> Um Christians Gedanken fortzuführen,
> ich nehme immer Time::Hires --
>
> use Time::HiRes qw( gettimeofday tv_interval );
>
> ...
> $t0 = [gettimeofday];
> insert_code_to_time_here;
> $t1 = [gettimeofday];
>
> $t0_t1 = tv_interval $t0, $t1;
Warum nicht:
$t0 = gettimeofday;
insert_code_to_time_here;
$t1 = gettimeofday;
$t0_t1 = $t1 - $t0;
?
Stören Dich die Rundungsfehler im Submikrosekundenbereich (Die
Genauigkeit ist bei derzeit ca. 30 Bit für die Sekunden und knapp 20 Bit
für die Mikrosekunden hart an der Grenze dessen, was man mit einem
Double noch darstellen kann)? Die sind nur Die würde ich nur als
ästhetisches Problem sehen: gettimeofday liefert ein maximal auf
Mikrosekunden genaues Ergebnis, wenn da durch Rundungsfehler noch einmal
eine Ungenauigkeit von ca. 0.1 µs dazukommt, macht das keinen
wesentlichen Unterschied.
Ich bevorzuge allerdings:
use Time::HiRes 'time';
$t0 = time;
insert_code_to_time_here;
$t1 = time;
$t0_t1 = $t1 - $t0;
Der eigentliche Code ist dann mit oder ohne Time::HiRes der gleiche, nur
die Genauigkeit ändert sich.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: Zeitberechnung
am 22.09.2006 12:28:41 von vicodas
Danke der Ansatz war sehr gut!
schönes WE,
Gruß Karsten
Re: Zeitberechnung
am 22.09.2006 12:31:08 von Robert Berghaus
Mirco Wahab schrieb:
> Thus spoke Karsten Schöke (on 2006-09-22 11:05):
>=20
>=20
[...]
> ...
> $t0 =3D [gettimeofday];
> insert_code_to_time_here;
> $t1 =3D [gettimeofday];
>=20
Ohne die Funktion gettimeofday zu kennen, dürfte es beim=20
Tageswechsel zu Fehlern kommen (kann auch sein, daß mein Englisch=20
zu schlecht ist) ;-)
[...]
Schönen Gruß aus dem Bergischen Land
Robert
Re: Zeitberechnung
am 22.09.2006 12:58:09 von Mirco Wahab
Thus spoke Peter J. Holzer (on 2006-09-22 12:19):
> On 2006-09-22 09:23, Mirco Wahab wrote:
>> Thus spoke Karsten Schöke (on 2006-09-22 11:05):
>>
>> use Time::HiRes qw( gettimeofday tv_interval );
>> ...
>> $t0 = [gettimeofday];
>> insert_code_to_time_here;
>> $t1 = [gettimeofday];
>> ...
>> $t0_t1 = tv_interval $t0, $t1;
>
> Warum nicht:
>
> $t0 = gettimeofday;
> insert_code_to_time_here;
> $t1 = gettimeofday;
> ...
> $t0_t1 = $t1 - $t0;
>
> Stören Dich die Rundungsfehler im Submikrosekundenbereich ...
Für solche 'überschaubaren' timings ist das sicherlich
o.k. und auch angemessen (dachte ich). IIRC kam die ref-Form
von [gettimeofday] um einen Überlauf bei Sekunden zu umgehen.
Meine Verwendung ist also im Wesentlichen "/nehmen wir mal
das beste das wir kennen/"-Philosophie des "/wird dann schon
klappen/", ohne mich wirklich im Dschungel der time-Funktionen
richtig auszukennen.
Wahrscheinlich wäre sowas wie Dein
use Time::HiRes qw( time );
$t0 = time;
... [do sth.] ...
$seconds = time - $t0;
printf "%.5f", $seconds;
im gefragten Szenario völlig o.k. gewesen.
Viele Grüße und Danke (für den Wink mit Time::HiRes::time)
Mirco
Re: Zeitberechnung
am 22.09.2006 13:17:57 von Ch Lamprecht
Robert Berghaus schrieb:
> Mirco Wahab schrieb:
>
>> Thus spoke Karsten Schöke (on 2006-09-22 11:05):
>>
>>
> [...]
>
>> ...
>> $t0 = [gettimeofday];
>> insert_code_to_time_here;
>> $t1 = [gettimeofday];
>>
> Ohne die Funktion gettimeofday zu kennen,
dann schau doch nach...
perldoc Time::HiRes
gettimeofday ()
In array context returns a two-element array with the seconds and
microseconds since the epoch. In scalar context returns floating
seconds like "Time::HiRes::time()" (see below).
Christoph
dürfte es beim Tageswechsel zu
> Fehlern kommen (kann auch sein, daß mein Englisch zu schlecht ist) ;-)
>
> [...]
>
>
> Schönen Gruß aus dem Bergischen Land
> Robert
>
--
perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"