Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Neutral General 11. Okt 2017 14:11

AW: Windows.GetTickCount64 auch unter Windows XP?
 
PS: Klassen sind optional und nicht immer notwendig oder sinnvoll :duck:

Zacherl 11. Okt 2017 14:13

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

Zitat von Neutral General (Beitrag 1383109)
PS: Klassen sind optional und nicht immer notwendig oder sinnvoll :duck:

:thumb: Würde stattdessen auch einfach eine freistehende Funktion (ggfls. in einer seperaten Unit) bevorzugen.

Wenn es doch umbedingt in einer "Klasse" sein soll, dann klatsch noch ein
Delphi-Quellcode:
static
vor das
Delphi-Quellcode:
inline
und mach das
Delphi-Quellcode:
class
zu
Delphi-Quellcode:
record
, dann sparst du dir noch ein (verstecktes) Funktionsargument und zusätzlich die (nicht benötigten) RTTI-Infos für die Klasse. Und dann kannst du auch die
Delphi-Quellcode:
threadvar
s direkt noch mit in den Record übernehmen.

Glados 11. Okt 2017 14:13

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Das weiß ich =)
Ich benutze sie sehr gerne und überall in meinen Units.

Wenn ich irgendwo im Code stehen habe
Delphi-Quellcode:
GetTickCount64
dann kann das von Winapi.Windows kommen oder aus der eigenen Unit - kommt ganz auf die Reihenfolge in den uses an.
Wenn ich aber
Delphi-Quellcode:
TGetTickCount.GetTickCount64
sehe weiß ich genau wo es herkommt.

Edit
Klar ich kann auch ohne Klasse arbeiten und schreibe
Delphi-Quellcode:
MeineUnit.GetTickCount64
aber dann bekomme ich ggf. Probleme wenn ich die Unit mal umbenennen will.

So?
Delphi-Quellcode:
type
 TGetTickCount = record
 public
  class function GetTickCount64: UInt64; static; inline;
 end;

Zacherl 11. Okt 2017 14:16

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Delphi-Quellcode:
type
  TTest = record
  strict private
    class threadvar High: UInt64;
    class threadvar LastLow: Cardinal;
  public
    class function GetTickCount64: UInt64; static; inline;
  end;

{ TTest }

class function TTest.GetTickCount64: UInt64;
begin
  // ...
end;

Dalai 11. Okt 2017 14:29

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

Zitat von himitsu (Beitrag 1383089)
Also ja, vor Windows 8 gibt es das nicht [...]

Auch wenn im weiter oben geposteten Code schon die richtige
Delphi-Quellcode:
if
-Bedingung benutzt wird: GetTickCount64 gibt's ab Vista, nicht erst ab Win8. Vermutlich haben deine Augen der Angabe "Windows Phone 8" zuviel Aufmerksamkeit geschenkt ;).

Grüße
Dalai

Glados 11. Okt 2017 14:45

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

dann sparst du dir noch ein (verstecktes) Funktionsargument und zusätzlich die (nicht benötigten) RTTI-Infos für die Klasse
Alles erledigt. Der Speicherverbrauch ist sogar etwas gesunken.

Durch die Änderung von class zu record habe ich sogar noch ein paar Compilerfehler bekommen an Stellen, wo ich static vergessen hatte hinzuzufügen.
Habe dann direkt auch mal alle packed records in records umgeschrieben.

Ich denke nun ist alles klar.

TRomano 13. Okt 2017 10:40

AW: Windows.GetTickCount64 auch unter Windows XP?
 
Also habe ich das richtig verstanden, dass Du einfach nur die Ticks auslesen willst ? Wenn ja, wieso dann so kompliziert ?

Delphi-Quellcode:
function GetTicks : UInt64; register;
asm
  rdtsc
{$IFDEF WIN64} 
  shl rdx, 32
  or rax, rdx
{$ENDIF}
end;
Das sollte für rudimentäre Zwecke reichen. Willst Du ganz exaktes Messen veranstalten, da nimm doch die Routine von Agner Fog (Optimierungs Papst) :wink: :

Delphi-Quellcode:
function GetTicks : UInt64;
asm
{$IFDEF CPUX64}
  .NOFRAME
  // by Agner Fog
  push   rbx                   // ebx is modified by cpuid
  sub    rax, rax              // 0
  cpuid                         // serialize
  rdtsc                         // read time stamp counter into edx:eax
  shl    rdx, 32
  or     rax, rdx              // combine into 64 bit register      
  push   rax
  sub    eax, eax
  cpuid                         // serialize
  pop    rax                   // return value
  pop    rbx
  ret
{$ELSE}
  push   ebx                   // ebx is modified by cpuid
  sub    eax, eax              // 0
  cpuid                         // serialize
  rdtsc                         // read time stamp counter
  push   eax
  push   edx
  sub    eax, eax
  cpuid                         // serialize
  pop    edx
  pop    eax
  pop    ebx
  ret
{$ENDIF}
end;
Um auf das "Tick" genau zu sein, müsstest Du dann zusätzlich die Funktion hintereinander aufrufen und die Differenz bilden. Bei späteren Messungen ist diese Differenz (verursacht von dem Funktionsaufruf) abzuziehen.

Gruß Thomas

Sherlock 13. Okt 2017 11:01

AW: Windows.GetTickCount64 auch unter Windows XP?
 
...und weil Windows immer noch kein Echtzeitbetriebssystem ist, darf man sich langsam wundern, zu welchen Exzessen manche Entwickler bereit sind, nur um (in diesen zeitlichen Auflösungen) vermutlich falsche Zahlen zu bekommen.

Sherlock

Glados 13. Okt 2017 11:41

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

...und weil Windows immer noch kein Echtzeitbetriebssystem ist, darf man sich langsam wundern, zu welchen Exzessen manche Entwickler bereit sind, nur um (in diesen zeitlichen Auflösungen) vermutlich falsche Zahlen zu bekommen.
Ist das jetzt Ironie? Verstehe es nicht. Ist der ASM-Code da oben also nicht gut?

Eins ist klar. Die obere der beiden ASM-Funktionen gibt Quark zurück.

GetTickCount64 gibt: 653.954.506
GetTick gibt zurück: 1.349.183.170.576.009

p80286 13. Okt 2017 12:04

AW: Windows.GetTickCount64 auch unter Windows XP?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 2 von 3     12 3      

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