![]() |
Re: TFileTime addieren
Deswegen musst du ja auch die einzelnen Teile den DWORD-Parts zuweisen und addierst dann die QWORD, so wie in meinem Beispiel.
|
Re: TFileTime addieren
Also so:
Delphi-Quellcode:
KernelTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime;
KernelTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime; UserTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime; UserTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime; CPUTime64.QuadPart := KernelTime64.QuadPart + UserTime64.QuadPart; CPUTimeft.dwLowDateTime := CPUTime64.LowPart; CPUTimeft.dwHighDateTime := CPUTime64.HighPart; FileTimeToSystemTime(CPUTimeft, st); GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, TimeStr, SizeOf(TimeStr)); |
Re: TFileTime addieren
Wenn du den "Copy&Paste"-Fehler noch korrigierst, könnte es was werden:
Delphi-Quellcode:
Gruß Hawkeye
//UserTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime;
//UserTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime; UserTime64.LowPart := ProcList.Items[i].UserTime.dwLowDateTime; UserTime64.HighPart := ProcList.Items[i].UserTime.dwHighDateTime; |
Re: TFileTime addieren
:oops:
|
Re: TFileTime addieren
Ich häng mich hier mal hintendran, weil ich dasselbe Problem habe, und gerade damit nicht weiterkomme. Ich möchte bestimmen, wieviel Zeit eine Berechnung benötigt, und QueryPerformanceCounter scheint nicht auszureichen (da gibts manchmal Ausreißer, die ich mir nur dadurch erklären kann, dass ein anderer Prozess gerade rumgewerkelt hat). Mein Code sieht so aus:
Delphi-Quellcode:
Aber dabei kommen unsinnige Werte bei raus - sehr oft 0, und ab und zu andere Werte, aber dann recht oft derselbe (oder sogar immer). Irgendwas ist also falsch. Oder geh ich die Sache komplett falsch an?
function GetUsageTime: Int64;
var fCreationTime, fExitTime: TFileTime; fKernelTime, fUserTime: TFileTime; UserTime64, KernelTime64: _Large_Integer; begin GetProcessTimes(GetCurrentProcess, fCreationTime, fExitTime, fKernelTime, fUserTime); KernelTime64.LowPart := fKernelTime.dwLowDateTime; KernelTime64.HighPart := fKernelTime.dwHighDateTime; UserTime64.LowPart := fUserTime.dwLowDateTime; UserTime64.HighPart := fUserTime.dwHighDateTime; result := KernelTime64.QuadPart + UserTime64.QuadPart; end; Function GetAlgorithmTime: Int64; var s,e: Int64; begin s := GetUsageTime; // Zeit nehmen DoAlgorithm; // Berechnung ausführen e := GetUsageTime; // Zeit nehmen result := e-s; // Differenz ist das Ergbnis end; |
Re: TFileTime addieren
Hi,
wenn du ab und zu 0 als Ergebnis erhältst, dann könnte das daran liegen, dass sich die Laufzeit von DoAlgorithm nahe der Zeitauflösung (10 ms) bewegt. Um "einigermaßen verlässliche" Ergebnisse zu erzielen, wirst du wohl minimal 2 * 10 ms messen müssen. Ansonsten halte ich das mehrmalige Auftreten desselben Ergebnisses nicht unbedingt für einen Fehler. Bei geeigneten Testfällen wirst du bemerken, dass du durchaus variierende Zeiten erhältst - aus ähnlichen Gründen wie bei der Verwendung von QueryPerformanceCounter.
Delphi-Quellcode:
Wenn dein System gelegentlich eine Zeitsynchronisierung durchführt, dann sind die Ergebnisse natürlich verfälscht.
function GetUsageTime: TFileTime;
var ftDummy: TFileTime; ftKernelTime, ftUserTime: TFileTime; begin GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime); Result := TFileTime(Int64(ftKernelTime) + Int64(ftUserTime)); end; Freundliche Grüße |
Re: TFileTime addieren
Ist die Auflösung bei dem Ding nicht 100ns, also Zehntel Mikro-Sekunden? :gruebel:
Wenn ich deinen Code so abändere, also ohne die abschließende Konvertierung nach TFileTime
Delphi-Quellcode:
, dann erhalte ich wieder unsinnige Werte. Das heißt in 80-90% Null, und in den anderen Fällen 31200. Und das kann nicht sein.
function GetUsageTime: Int64;
var ftDummy: TFileTime; ftKernelTime, ftUserTime: TFileTime; begin GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime); Result := (Int64(ftKernelTime) + Int64(ftUserTime)); end; Ja, die Algorithmen sind recht schnell, mit QueryPerformanceCounter krieg ich raus, dass die je nach Eingabe nur wenige Dutzend µs brauchen - daher schlägt es ja auch durch, wenn Vista während eines Durchlaufs mal kurz guckt, was sonst noch so zu tun ist. Da sind dann halt ab und zu Ausreißer von ein paar hundert µs dabei, und die machen das Bild kaputt - auch wenn man über mehrere Durchläufe mittelt. |
Re: TFileTime addieren
Die Zeiteinheit von FileTime ist 100 ns - die Auflösung von GetProcessTimes() ist 10 ms, wie bei allen Windows Time Funktionen. Nur die High Precision Timer sind genauer.
|
Re: TFileTime addieren
...mit anderen Worten: Das Ding bringt mir gar nichts. Auch gut - dann muss ich die Ausreißer halt rausdiskutieren.
|
Re: TFileTime addieren
Vielleicht solltest du noch nach einer Erklärung für den Wert 31200 suchen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz