AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileTime addieren

Ein Thema von Luckie · begonnen am 6. Aug 2007 · letzter Beitrag vom 19. Feb 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: TFileTime addieren

  Alt 6. Aug 2007, 12:44
Deswegen musst du ja auch die einzelnen Teile den DWORD-Parts zuweisen und addierst dann die QWORD, so wie in meinem Beispiel.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: TFileTime addieren

  Alt 6. Aug 2007, 12:51
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));
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#13

Re: TFileTime addieren

  Alt 6. Aug 2007, 13:03
Wenn du den "Copy&Paste"-Fehler noch korrigierst, könnte es was werden:

Delphi-Quellcode:
//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;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: TFileTime addieren

  Alt 6. Aug 2007, 13:07
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: TFileTime addieren

  Alt 18. Feb 2008, 15:04
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:
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;
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: TFileTime addieren

  Alt 18. Feb 2008, 17:06
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:
function GetUsageTime: TFileTime;
var
  ftDummy: TFileTime;
  ftKernelTime, ftUserTime: TFileTime;
begin
  GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime);
  Result := TFileTime(Int64(ftKernelTime) + Int64(ftUserTime));
end;
Wenn dein System gelegentlich eine Zeitsynchronisierung durchführt, dann sind die Ergebnisse natürlich verfälscht.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: TFileTime addieren

  Alt 18. Feb 2008, 18:19
Ist die Auflösung bei dem Ding nicht 100ns, also Zehntel Mikro-Sekunden?

Wenn ich deinen Code so abändere, also ohne die abschließende Konvertierung nach TFileTime
Delphi-Quellcode:
function GetUsageTime: Int64;
var
  ftDummy: TFileTime;
  ftKernelTime, ftUserTime: TFileTime;
begin
  GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime);
  Result := (Int64(ftKernelTime) + Int64(ftUserTime));
end;
, 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.

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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#18

Re: TFileTime addieren

  Alt 18. Feb 2008, 18:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: TFileTime addieren

  Alt 18. Feb 2008, 18:47
...mit anderen Worten: Das Ding bringt mir gar nichts. Auch gut - dann muss ich die Ausreißer halt rausdiskutieren.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: TFileTime addieren

  Alt 18. Feb 2008, 19:10
Vielleicht solltest du noch nach einer Erklärung für den Wert 31200 suchen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz