Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows.GetTickCount64 auch unter Windows XP? (https://www.delphipraxis.net/194048-windows-gettickcount64-auch-unter-windows-xp.html)

Rollo62 13. Okt 2017 12:22

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Ist vielleicht "Off-topic", aber das TStopwatch gäbe es auch noch.
Nehme ich mittlerweile lieber statt der GetTickCounts, ist auch CrossPlatform :stupid:

Rollo

Glados 13. Okt 2017 12:33

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Kann man demnach die oben genannten Routinen statt GetTickCount(64) verwenden oder eher nicht?

himitsu 13. Okt 2017 13:16

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Zitat:

Zitat von p80286 (Beitrag 1383227)
Naja "falsch" würde ich das nicht nennen. Das ist ungefär so, als würdest du eine Stopuhr für das Eierkochen nutzen. Je nachdem was, auf Deinem Rechner läuft, ist die Zeitspanne für ein und die selbe Routine immer unterschiedlich. Da erreichst Du eine Genauigkeit, die keine Aussagekraft besitzt. Unter Windows mußt Du immer mehrere Messungen durchführen um einen Trend zu erkennen. Eine Aussage wie "die Laufzeit ist 25 Timerticks" ist unter Windows schlicht Blödsinn.

Gruß
K-H

"vermutlich" :roll:

Früher (vielleicht auch teilweise noch heute) hatte jeder CPU-Kern seinen eigenen Tickcounter
* Problem: Windowsch schiebt standardmäßig die Programme umher, also wenn du den ersten TickCount nimmst und mit einem zweiten verrechnest (Differenz), dann kann da schnell Mist raus kommen, wenn zwischendurch dein Programm (der Thread) auf einen anderen Kern verschoben wurde.
Daher gingen viele CPU-Hersteller dazu über einen "virtuellen" globalen TickCount zu nehmen, der mit keinem der Kerne übereinstimmt.

Außerdem werden häufig die CPUs/Kerne zur Laufzeit lastabhängig getacktet.

Fazit: dieser der CPU-TickCount stimmt nicht mehr mit den Ticks (ausgeführten Aktionen auf dem Kern) der Kerne überein.


Und bezüglich Echtzeitsystem ... jupp, jede Anwendung/Thread hat einen TimeSlot und wirt zwischendurch immer mal wieder pausiert, während andere Prozesse/Threads auf dem Kern rechnen dürfen.

Zacherl 13. Okt 2017 15:46

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Zu RDTSC:
Zitat:

Zitat von MSDN
We strongly discourage using the RDTSC or RDTSCP processor instruction to directly query the TSC because you won't get reliable results on some versions of Windows, across live migrations of virtual machines, and on hardware systems without invariant or tightly synchronized TSCs. Instead, we encourage you to use QPC to leverage the abstraction, consistency, and portability that it offers.

Möglichst hohe Genauigkeit ist für normale Timer-Zwecke aber ja eh ziemlich irrelevant. So wie ich es verstanden habe, will der TE nur einen performanten Timer, welcher auch bei langen Laufzeiten nicht overflowt. Weitere Kriterien wurden ja nicht genannt. Zum Benchmarken ist unter Windows sicherlich MSDN-Library durchsuchenQueryPerformanceCounter die bessere Lösung. Außerdem sollte man dann die CPU Mask auf einen Kern fixieren und ggfls. noch die Prozess- und Thread-Priorität auf Maximum schrauben.

Daniel 14. Okt 2017 08:58

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Ich habe hier vier Beiträge gelöscht, die in einer völligen Entgleisung endeten.

Fukiszo 15. Jan 2018 21:18

AW: Windows.GetTickCount64 auch unter Windows XP?
 
ich nutz QueryPerformanceCounter immer wenn ich was benche, ich finde es sehr präzise.
Nur als vergleich gegen GetTickCount egal ob x86 oder x64.
Als alternative halt.
Ich hoffe der code ist mit neueren delphi versionen kompatibel.

Delphi-Quellcode:
{QueryPerformanceCounter uses the PC's clock counter just as GetTickCount, but it
reads the current value of the countdown register in the timer chip to gain more
accuracy -- down to 1.193MHz (about 800ns).

However, it takes 5 to 10us to call QueryPerformanceCounter, because it has to
do several port I/O instructions to read this value.

If you are running multiprocessor NT, QueryPerformanceCounter uses the Pentium
cycle counter.

You should not be using the raw value of QueryPerformanceCounter; you should
always divide by QueryPerformanceFrequency to convert to some known time base.
QueryPerformanceCounter doesn't run at the same rate on all machines.

The example below shows how to use it in Delphi 3/4:
}

type
  TInt64 = TLargeInteger;
var
  Frequency, lpPerformanceCount1, lpPerformanceCount2 : TLargeInteger;

begin
  QueryPerformanceCounter(TInt64((@lpPerformanceCount1)^));

  // activity to measure
  my_proc;

  QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));
  QueryPerformanceFrequency(TInt64((@Frequency)^));

  // this shows the time in ns
  ShowMessage(IntToStr(Round(1000000 * (lpPerformanceCount2.QuadPart -
                       lpPerformanceCount1.QuadPart) / Frequency.QuadPart)));
end;

hoika 15. Jan 2018 23:37

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Hallo,
OK, Info zur Starter-Edition gelöscht.
Kennt ja wohl jeder mittlerweise.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Seite 3 von 3     123   

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