Laden...

Now in milisekunden

Erstellt von Seikilos vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.362 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 16 Jahren
Now in milisekunden

Gibt es eine Möglichkeit now in milisekunden zu bekommen, ohne alles per hand rechnen zu müssen?
Ich guck hier schon im manual rum, es gibt toLongdate usw, aber nichts davon gibt mir die anzahlder milisekunden. Und Now.miliseconds ist es nicht! 🙂

Life is a short

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Seikilos,

wenn dein Programm nicht gerade um Mitternacht läuft:

(DateTime.Now - DateTime.Today).TotalMilliseconds

herbivore

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 16 Jahren

Ich probiere gerade das hier:


DateTime n = DateTime.Now;

int diff = (DateTime.Now-n).Milliseconds;
double diff2 = (DateTime.Now-n).TotalMilliseconds;

Da kommen aber konfuse werte raus, bei beiden

Life is a short

B
1.529 Beiträge seit 2006
vor 16 Jahren

Hast du auch das probiert, was herbivore oben schrieb?

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 16 Jahren

Ja, ist ungefähr das selbe, ich brauchte die ms zum benchmarken

Life is a short

664 Beiträge seit 2005
vor 16 Jahren

Hi

hast du dir die Klasse Stopwatch schon angeschaut?

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 16 Jahren

Nope, aber danke für den Tip

Life is a short

M
1.439 Beiträge seit 2005
vor 16 Jahren

Und warum verwendest du nicht DateTime.Ticks? Eignet sich doch hervorragend für einen Benchmark, und wenn nicht kannst du die Ticks auch in ms umrechnen.

The value of this property represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001.

345 Beiträge seit 2005
vor 16 Jahren

Leider sind die Ticks nur scheinbar genau genug, wenns wirklich um ms geht.

Ich zitiere mich mal selbst:

Für den praktischen Einsatz ist die Zeit, die ein bestimmtes Verfahren benötigt,
ein wichtiges Merkmal. C# bietet zur Zeitmessung die Möglichkeit anhand der
Systemzeit die so genannten „Ticks“ auszulesen. Ein Tick beträgt 100 ns<MIC-05>. Diese
ausreichende Genauigkeit hat sich durch ungewöhnliche Messergebnisse leider in
der Praxis als nur scheinbar hinreichend genau herausgestellt. Recherchen haben
ergeben, dass zur Bestimmung der Ticks der System-Zeitgeber verwendet wird,
der allerdings (je nach System) nur alle 15 ms bis 55 ms abgefragt wird<BAY-03>.
Deshalb wurde direkt der Performance-Counter des Mainboards abgefragt. Dieser
ist nicht bei allen Mainboards vorhanden, jedoch bei den meisten (inkl. dem
genutzten).
Die Dauer des Counters ist abhängig von der Frequenz des
Mainboards. Es lassen sich allerdings keine Rückschlüsse von der Prozessorgeschwindigkeit
oder des Bustaktes auf die Counterfrequenz ziehen. Eine Umwandlung
in eine echte Zeit kann jedoch über die ebenfalls ermittelbare Mainboardfrequenz
erfolgen. Die an unserem Rechner (per Software) ermittelte Mainboard-
Frequenz beträgt rund 3,41 MHz ( 3,58106 Hz ). Dies entspricht einer Auflösung
von 280 ns.

Im PDF-Original: http://www.nocarrier.de/dipl

Der Link hat ansonsten NIX mit dem Thema zu tun 🙂

(edit): Der Vollständigkeit halber: Die verwendeten QUellen:
[BAY-03] Jürgen Bayer: Das C# Codebook
Addison Wesley, 2003
(Kapitel 58, „Zeit genau messen“; Seite 189-193)

[MIC-05] Microsoft: MSDN
http://msdn.microsoft.com
2005

Mein Haus, mein Viertel, mein Blog

M
1.439 Beiträge seit 2005
vor 16 Jahren

Es ist schon klar, dass jede Zeitabfrage nur eine bestimmte Genauigkeit haben kann. So wird man mit DateTime.Ticks die angegebene Auflösung von 100ns auf derzeitigen Systemen nicht erreichen. Dennoch bildet dieser long Wert die Basis für den DateTime Datentyp und somit kannst du diesen Wert natürlich auch in ms umrechen.
Sollte dir die Auflösung von wie von dir angegeben 20 - 55 ms nicht reichen, musst du die QueryPerformanceCounter Funktion verwenden. Diese ließt vermutlich den Timestamp Counter des Prozessors aus und hat dadurch eine höhere Auflösung, die allerdings vom Systemtakt abhängig ist. Allerdings hat diese Funktion auch einige gravierende Nachteile(z.B.: Multicore Rechner, Speed-Step).

0
767 Beiträge seit 2005
vor 16 Jahren

also mit der Stopwatch Klasse kann ich auf meinem rechner performance in der größenordnung von 0.02 ms messen. (also 20µs), kürzeres kommt dabei nicht raus:


System.Diagnostics.Stopwatch w = System.Diagnostics.Stopwatch.StartNew();
w.Stop();
Console.WriteLine(w.Elapsed.TotalMilliseconds);

loop:
btst #6,$bfe001
bne.s loop
rts

M
68 Beiträge seit 2005
vor 16 Jahren

Die Stopwatch Klasse implementiert im Übrigen den QueryPerfomanceCounter. Das der auch nur eine beschränkte Genauigkeit hat ist ja wohl klar. Was genaueres kriegst aber imho nicht mit normalen Windowsmittlen.

mfg MasterOfDesaster