AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Windows.GetTickCount64 auch unter Windows XP?
Thema durchsuchen
Ansicht
Themen-Optionen

Windows.GetTickCount64 auch unter Windows XP?

Ein Thema von Glados · begonnen am 11. Okt 2017 · letzter Beitrag vom 15. Jan 2018
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:11
PS: Klassen sind optional und nicht immer notwendig oder sinnvoll
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#12

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:13
PS: Klassen sind optional und nicht immer notwendig oder sinnvoll
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 static vor das inline und mach das class zu 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 threadvar s direkt noch mit in den Record übernehmen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#13

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:13
Das weiß ich =)
Ich benutze sie sehr gerne und überall in meinen Units.

Wenn ich irgendwo im Code stehen habe 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 TGetTickCount.GetTickCount64 sehe weiß ich genau wo es herkommt.

Edit
Klar ich kann auch ohne Klasse arbeiten und schreibe 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;

Geändert von Glados (11. Okt 2017 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:16
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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#15

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:29
Also ja, vor Windows 8 gibt es das nicht [...]
Auch wenn im weiter oben geposteten Code schon die richtige 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
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#16

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von TRomano
TRomano

Registriert seit: 24. Nov 2004
Ort: Düsseldorf
190 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 13. Okt 2017, 10:40
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) :

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
Thomas Forget
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.762 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 13. Okt 2017, 11:01
...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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#19

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 13. Okt 2017, 11:41
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

Geändert von Glados (13. Okt 2017 um 11:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 13. Okt 2017, 12:04
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 20:29 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