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
Benutzerbild von Zacherl
Zacherl

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

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 12:05
Hier gibt es dazu noch einen Artikel mit Workarounds:
http://terryto-blog.tumblr.com/post/...4-alternatives
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#2

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 12:50
Zacherl, dein Artikel hat mich neugierig gemacht und die Schnelligkeit von _GetTickCount64 geprüft.

bei 999.999 aufrufen dauert die Ausführung schon knapp 400ms. Windows.GetTickCount54 braucht nur knapp 25ms.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 13:30
Welche der Versionen hast du denn verwendet? Die mit dem manuellen Overflow Check sollte die Performance nicht nennenswert verschlechtern (laut Artikel ist sie ja angablich sogar besser als die native MSDN-Library durchsuchenGetTickCount64 API).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#4

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 13:34
Ich habe himitu's Version (Link erster Beitrag) verwendet. Mit den anderen kann ich nichts anfangen, da es kein Delphi-Code ist.

Mehr als das hier bekomme ich nicht hin und selbst das ist bestimmt noch falsch
Delphi-Quellcode:
var
 high, lastLow: Int64;
begin
 high := 0;
 low := GetTickCount();

 if lastLow > low then
  // high += 0x100000000I64; ...

 lastLow = low;

 // return high | (ULONGLONG)low;
end;

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

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

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 13:44
Sollte in etwa so aussehen:
Delphi-Quellcode:
threadvar
  High: UInt64;
  LastLow: Cardinal;

function _GetTickCount64: UInt64; inline;
var
  Low: Cardinal;
begin
  Low := GetTickCount;
  if (LastLow > Low) then
  begin
    High := High + $0000000100000000;
  end;
  LastLow := Low;
  Result := High or Low;
end;
Ist etwas weniger als halb so performant wie die native Funktion, aber immer noch deutlich schneller als mit MSDN-Library durchsuchenQueryPerformanceCounter. Wenn du garantiert nur einen Thread hast, kannst du das threadvar auch durch var ersetzen - dann ist die Funktion in etwa gleich schnell wie die native Variante.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#6

AW: Windows.GetTickCount64 auch unter Windows XP?

  Alt 11. Okt 2017, 14:07
Ich habe das jetzt so gelößt

Delphi-Quellcode:
unit uGetTickCount64;

interface

uses
 Winapi.Windows, System.SysUtils;

threadvar High: UInt64;
LastLow:
Cardinal;

type
 TGetTickCount = class
 public
  class function GetTickCount64: UInt64; inline;
 end;

implementation

class function TGetTickCount.GetTickCount64: UInt64;
var
 Low: Cardinal;
begin
 if System.SysUtils.TOSVersion.Major >= 6 then // alles ab Windows Vista
  Result := Winapi.Windows.GetTickCount64
 else // alles vor Windows Vista
  begin
   Low := GetTickCount;
   if (LastLow > Low) then
    High := High + $0000000100000000;

   LastLow := Low;
   Result := High or Low;
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

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
 
#8

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
Benutzerbild von Zacherl
Zacherl

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

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 TRomano
TRomano

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

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
Antwort Antwort


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 05:30 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