Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
WatchDocTimerPerformanceCheck.cpp
[詳解]
1
5
6#include "pch.h"
8
9using namespace PerfCheck;
10
12 :PerformanceCheck (console)
13{
14
15}
16
18{
19
20}
21
23{
24 return this->Core ();
25}
26
28{
29 int interval = ::GetPrivateProfileInt (
30 _T ("WatchDogTimer"),
31 _T ("Interval"),
32 0,
33 _T (".\\PerformanceCheck.ini"));
34 if (interval == 0)
35 {
36 _tprintf (_T ("Not found Interval.\n"));
37 return FALSE;
38 }
39
40 int count = ::GetPrivateProfileInt (
41 _T ("WatchDogTimer"),
42 _T ("Count"),
43 0,
44 _T (".\\PerformanceCheck.ini"));
45 if (count == 0)
46 {
47 _tprintf (_T ("Not found count.\n"));
48 return FALSE;
49 }
50
51 auto timer = new alt::WatchDogTimer ();
52 auto data = new WatchDogData[count];
53 ZeroMemory (data, sizeof (data));
54 timer->InitTimer (_T ("DriveWatchDogTimerTest"));
56
57 timer->StartTimer (interval);
58
59 for (int i = 0; i < count; i++)
60 {
61 Q.Start ();
62 timer->WaitTimer ();
63 Q.Stop ();
64
65 data[i].Tick = interval;
66 data[i].Elapsed = Q.PastTime ();
67 data[i].StartTick = Q.GetStartTick ();
68 data[i].StopTick = Q.GetStopTick ();
69 data[i].Frequency = Q.GetFrequency ();
70 GetLocalTime (&data[i].SystemTime);
71 }
72
73 timer->StopTimer ();
74
75 double min = interval;
76 double max = interval;
77 double sum = 0;
78 double average = 0;
79 double sd = 0;
80
81 for (int i = 0; i < count; i++)
82 {
83 if (min > data[i].Elapsed) min = data[i].Elapsed;
84 if (max < data[i].Elapsed) max = data[i].Elapsed;
85 sum += data[i].Elapsed;
86 }
87 average = sum / count;
88
89 for (int i = 0; i < count; i++)
90 {
91 sd += pow (average - data[i].Elapsed, 2);
92 }
93 sd = pow (sd / count, 0.5);
94
95 LONGLONG previousStartTick = 0;
96
97 int seq = 0;
98 for (int i = 0; i < count; i++)
99 {
100 if (data[i].Elapsed < (interval - sd) || (interval + sd) < data[i].Elapsed)
101 {
102 double loopInterval = (data[i].StartTick.QuadPart - previousStartTick) * 1000.0 / (double)data[i].Frequency.QuadPart;
103 _tprintf (_T ("Seq=%3d No.%3d interval=%.4f Elapsed=%.4f diff=%+.4f LocalTime=%02d:%02d:%02d.%03d\n"),
104 seq++, i + 1,
105 loopInterval,
106 data[i].Elapsed,
107 data[i].Elapsed - interval,
108 data[i].SystemTime.wHour,
109 data[i].SystemTime.wMinute,
110 data[i].SystemTime.wSecond,
111 data[i].SystemTime.wMilliseconds);
112 }
113
114 previousStartTick = data[i].StartTick.QuadPart;
115 }
116
117 _tprintf (_T ("min=%.4f max=%.4f average=%.4f sd=%.4f\n"), min, max, average, sd);
118
119 delete[] data;
120 delete timer;
121
122 _tprintf (_T ("DriveWatchDogTimerTest() OUT.\n"));
123
124 return TRUE;
125}
WatchDocTimerクラス性能測定用
プリコンパイル済みヘッダー ファイルです。
コンソールに関するクラス
Definition: Console.h:88
高分解能時間計測クラス
LARGE_INTEGER APIENTRY GetFrequency() const
現在のタイマー分解能を取得します。
LARGE_INTEGER APIENTRY GetStopTick() const
Stop()時のカウンター値を取得します。
VOID APIENTRY Start()
計測を開始します。
LARGE_INTEGER APIENTRY GetStartTick() const
Start()時のカウンター値を取得します。
double APIENTRY PastTime() const
計測開始〜計測終了までの時間を出力します。
VOID APIENTRY Stop()
計測を終了します。
タイマーに関するWindowsAPIを集約したクラス
Definition: WatchDogTimer.h:18