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
Hallo Seikilos,
wenn dein Programm nicht gerade um Mitternacht läuft:
(DateTime.Now - DateTime.Today).TotalMilliseconds
herbivore
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
Hast du auch das probiert, was herbivore oben schrieb?
Ja, ist ungefähr das selbe, ich brauchte die ms zum benchmarken
Life is a short
Hi
hast du dir die Klasse Stopwatch schon angeschaut?
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.
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
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).
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
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