Zeitberechnung

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/"