freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2-demos] master 8b0c22c: [ftbench] Add Windows performance time


From: Werner Lemberg
Subject: [freetype2-demos] master 8b0c22c: [ftbench] Add Windows performance timers.
Date: Thu, 18 Mar 2021 22:50:46 -0400 (EDT)

branch: master
commit 8b0c22c57895f5d40972d89889051e30dc976dfc
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    [ftbench] Add Windows performance timers.
    
    * src/ftbench.c (get_time) [_WIN32]: Add QPC, GPT, and QPCT timing tools.
    (main) [_WIN32]: Initialize interval for QPC.
---
 ChangeLog     |  8 ++++++++
 src/ftbench.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 5576140..fa6f62c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2021-03-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [ftbench] Add Windows performance timers.
+
+       * src/ftbench.c (get_time) [_WIN32]: Add QPC, GPT, and QPCT timing
+       tools.
+       (main) [_WIN32]: Initialize interval for QPC.
+
 2021-02-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
        [graph/x11] Gray multiplication tricks.
diff --git a/src/ftbench.c b/src/ftbench.c
index 616bf5a..37e8e0e 100644
--- a/src/ftbench.c
+++ b/src/ftbench.c
@@ -43,6 +43,20 @@
 
 #include "common.h"
 
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* Specify the timer: QPC for accurate wall time, GPT for user-mode time. */
+/* Otherwise, QPCT cycles are measured accurately but with huge overhead. */
+#define QPC
+
+#ifdef QPC
+  double  interval;
+#endif
+
+#endif
+
 
   typedef struct  btimer_t_ {
     double  t0;
@@ -195,6 +209,35 @@
 #endif /* _POSIX_CPUTIME */
 
     return 1E6 * (double)tv.tv_sec + 1E-3 * (double)tv.tv_nsec;
+
+#elif defined _WIN32
+
+#ifdef QPC
+    LARGE_INTEGER  ticks;
+
+
+    QueryPerformanceCounter( &ticks );
+
+    return  interval * ticks.QuadPart;
+
+#elif defined GPT
+    FILETIME  start, end, kern, user;
+
+
+    GetProcessTimes( GetCurrentProcess(), &start, &end, &kern, &user );
+
+    return  0.1 * user.dwLowDateTime + 429496729.6 * user.dwHighDateTime;
+
+#else
+    ULONG64  cycles;
+
+
+    QueryProcessCycleTime( GetCurrentProcess(), &cycles );
+
+    return  1e-3 * cycles; /* at 1GHz */
+
+#endif
+
 #else
     /* clock() accuracy has improved since glibc 2.18 */
     return 1E6 * (double)clock() / (double)CLOCKS_PER_SEC;
@@ -954,6 +997,13 @@
     int           version;
     char         *engine;
 
+#if defined _WIN32 && defined QPC
+    LARGE_INTEGER  freq;
+
+    QueryPerformanceFrequency( &freq );
+    interval = 1e6 / freq.QuadPart;
+#endif
+
 
     if ( FT_Init_FreeType( &lib ) )
     {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]