Skip to content

Instantly share code, notes, and snippets.

@sayurin
Last active April 6, 2023 02:17
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save sayurin/f47ddf0db901c1e0c5a905c718a749d1 to your computer and use it in GitHub Desktop.
Save sayurin/f47ddf0db901c1e0c5a905c718a749d1 to your computer and use it in GitHub Desktop.
#include <cmath>
#include <thread>
#include <Windows.h>
#include <MMSystem.h>
#pragma comment(lib, "winmm")
struct MultiMediaTimer {
static const wchar_t* name;
static LARGE_INTEGER elapsed[10000];
static int idx;
static MMRESULT handle;
static void start(DWORD period) {
handle = timeSetEvent(period, 0, [](UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR) {
QueryPerformanceCounter(&elapsed[idx++]);
}, 0, TIME_PERIODIC);
}
static void end() {
timeKillEvent(handle);
}
};
const wchar_t* MultiMediaTimer::name = L"Multi Media Timer";
int MultiMediaTimer::idx;
LARGE_INTEGER MultiMediaTimer::elapsed[10000];
MMRESULT MultiMediaTimer::handle;
struct TimerQueues {
static const wchar_t* name;
static LARGE_INTEGER elapsed[10000];
static int idx;
static HANDLE handle;
static void start(DWORD period) {
CreateTimerQueueTimer(&handle, nullptr, [](void*, BOOLEAN) {
QueryPerformanceCounter(&elapsed[idx++]);
}, nullptr, 0, period, 0);
}
static void end() {
DeleteTimerQueueTimer(nullptr, handle, nullptr);
}
};
const wchar_t* TimerQueues::name = L"Timer Queues";
int TimerQueues::idx;
LARGE_INTEGER TimerQueues::elapsed[10000];
HANDLE TimerQueues::handle;
struct ThreadpoolTimer {
static const wchar_t* name;
static LARGE_INTEGER elapsed[10000];
static int idx;
static PTP_TIMER handle;
static void start(DWORD period) {
handle = CreateThreadpoolTimer([](PTP_CALLBACK_INSTANCE, PVOID, PTP_TIMER) {
QueryPerformanceCounter(&elapsed[idx++]);
}, nullptr, nullptr);
FILETIME dueTime = { 0xFFFFFFFF, 0xFFFFFFFF };
SetThreadpoolTimer(handle, &dueTime, period, 0);
}
static void end() {
CloseThreadpoolTimer(handle);
}
};
const wchar_t* ThreadpoolTimer::name = L"Thread Pool Timer";
int ThreadpoolTimer::idx;
LARGE_INTEGER ThreadpoolTimer::elapsed[10000];
PTP_TIMER ThreadpoolTimer::handle;
struct WaitableTimer {
static const wchar_t* name;
static LARGE_INTEGER elapsed[10000];
static int idx;
static std::thread thread;
static HANDLE handle;
static void start(DWORD period) {
thread = std::thread([period]{
handle = CreateWaitableTimerW(nullptr, false, nullptr);
LARGE_INTEGER dueTime;
dueTime.QuadPart = -1;
SetWaitableTimer(handle, &dueTime, period, nullptr, nullptr, true);
for (;;) {
if (WaitForSingleObject(handle, INFINITE) != WAIT_OBJECT_0)
break;
QueryPerformanceCounter(&elapsed[idx++]);
}
});
}
static void end() {
CloseHandle(handle);
thread.join();
}
};
const wchar_t* WaitableTimer::name = L"Waitable Timer";
int WaitableTimer::idx;
LARGE_INTEGER WaitableTimer::elapsed[10000];
std::thread WaitableTimer::thread;
HANDLE WaitableTimer::handle;
struct UITimer {
static const wchar_t* name;
static LARGE_INTEGER elapsed[10000];
static int idx;
static std::thread thread;
static bool stop;
static void start(DWORD period) {
stop = false;
thread = std::thread([period] {
SetTimer(nullptr, 1, period, nullptr);
while (!stop) {
MSG msg;
if (GetMessage(&msg, 0, 0, 0) && msg.message == WM_TIMER)
QueryPerformanceCounter(&elapsed[idx++]);
}
});
}
static void end() {
stop = true;
thread.join();
}
};
const wchar_t* UITimer::name = L"SetTimer";
int UITimer::idx;
LARGE_INTEGER UITimer::elapsed[10000];
std::thread UITimer::thread;
bool UITimer::stop;
static LARGE_INTEGER freq;
template <class Timer, const LARGE_INTEGER* elapsed = Timer::elapsed>
void run(DWORD period) {
Timer::idx = 0;
Timer::start(period);
Sleep(period);
auto startIdx = Timer::idx;
Sleep(1000);
auto endIdx = Timer::idx - 1;
Timer::end();
auto count = endIdx - startIdx;
auto totaltime = double(elapsed[endIdx].QuadPart - elapsed[startIdx].QuadPart) / freq.QuadPart * 1000;
auto avg = totaltime / count;
auto error = 0.0;
for (auto idx = startIdx; idx < endIdx; idx++) {
auto time = double(elapsed[idx + 1].QuadPart - elapsed[idx].QuadPart) / freq.QuadPart;
auto off = std::fabs(time - period / totaltime) / (period / totaltime) * 100;
error += off;
}
error /= count;
auto stddev = 0.0;
for (auto idx = startIdx; idx < endIdx; idx++) {
auto time = double(elapsed[idx + 1].QuadPart - elapsed[idx].QuadPart) / freq.QuadPart;
auto off = std::fabs(time - period / totaltime) / (period / totaltime) * 100;
stddev += (off - error) * (off - error);
}
stddev = std::sqrt(stddev / (count - 1));
wprintf(L" %-20s: count=%4d, avg=%8.4f, avg error=%8.3f%%, std dev=%7.3f\n", Timer::name, count, avg, error, stddev);
}
void run() {
for (const auto& period : { 100, 50, 20, 10, 5, 2, 1 }) {
wprintf(L" Period: %dms\n", period);
run<MultiMediaTimer>(period);
run<TimerQueues>(period);
run<ThreadpoolTimer>(period);
run<WaitableTimer>(period);
run<UITimer>(period);
}
}
int wmain() {
QueryPerformanceFrequency(&freq);
wprintf(L"w/ timeBeginPeriod():\n");
timeBeginPeriod(1);
run();
timeEndPeriod(1);
wprintf(L"\nw/o timeBeginPeriod():\n");
run();
return 0;
}
w/ timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg= 99.9897, avg error= 10.018%, std dev= 0.079
Timer Queues : count= 9, avg= 99.9026, avg error= 10.175%, std dev= 0.235
Thread Pool Timer : count= 9, avg=100.0002, avg error= 10.000%, std dev= 0.497
Waitable Timer : count= 10, avg= 99.9434, avg error= 0.127%, std dev= 0.159
SetTimer : count= 9, avg=109.3903, avg error= 7.696%, std dev= 2.962
Period: 50ms
Multi Media Timer : count= 20, avg= 49.9818, avg error= 0.488%, std dev= 0.540
Timer Queues : count= 20, avg= 49.9533, avg error= 0.481%, std dev= 0.586
Thread Pool Timer : count= 19, avg= 50.0006, avg error= 4.998%, std dev= 0.940
Waitable Timer : count= 19, avg= 49.9881, avg error= 5.045%, std dev= 0.287
SetTimer : count= 15, avg= 62.5430, avg error= 17.349%, std dev= 2.152
Period: 20ms
Multi Media Timer : count= 49, avg= 19.9880, avg error= 2.412%, std dev= 1.227
Timer Queues : count= 49, avg= 19.9910, avg error= 2.500%, std dev= 1.448
Thread Pool Timer : count= 49, avg= 20.0103, avg error= 2.286%, std dev= 1.530
Waitable Timer : count= 49, avg= 20.0038, avg error= 1.963%, std dev= 0.600
SetTimer : count= 32, avg= 31.1942, avg error= 55.693%, std dev= 10.550
Period: 10ms
Multi Media Timer : count= 99, avg= 9.9929, avg error= 2.730%, std dev= 2.660
Timer Queues : count= 99, avg= 9.9969, avg error= 2.540%, std dev= 3.044
Thread Pool Timer : count= 100, avg= 9.9949, avg error= 1.926%, std dev= 2.405
Waitable Timer : count= 99, avg= 10.0013, avg error= 2.409%, std dev= 2.987
SetTimer : count= 62, avg= 15.5139, avg error= 51.318%, std dev= 45.840
Period: 5ms
Multi Media Timer : count= 199, avg= 4.9967, avg error= 3.222%, std dev= 4.307
Timer Queues : count= 199, avg= 4.9946, avg error= 3.541%, std dev= 5.567
Thread Pool Timer : count= 199, avg= 4.9997, avg error= 3.211%, std dev= 4.936
Waitable Timer : count= 199, avg= 4.9999, avg error= 5.204%, std dev= 6.404
SetTimer : count= 63, avg= 15.6730, avg error= 209.509%, std dev= 97.202
Period: 2ms
Multi Media Timer : count= 499, avg= 2.0002, avg error= 5.569%, std dev= 10.777
Timer Queues : count= 499, avg= 1.9999, avg error= 5.473%, std dev= 11.228
Thread Pool Timer : count= 499, avg= 2.0001, avg error= 5.466%, std dev= 11.067
Waitable Timer : count= 499, avg= 2.0001, avg error= 5.665%, std dev= 10.460
SetTimer : count= 63, avg= 15.7026, avg error= 676.698%, std dev=242.043
Period: 1ms
Multi Media Timer : count= 999, avg= 1.0004, avg error= 7.474%, std dev= 18.139
Timer Queues : count= 934, avg= 1.0706, avg error= 7.802%, std dev= 4.677
Thread Pool Timer : count= 936, avg= 1.0677, avg error= 7.226%, std dev= 4.488
Waitable Timer : count= 998, avg= 1.0020, avg error= 0.487%, std dev= 3.073
SetTimer : count= 63, avg= 15.6245, avg error=1437.990%, std dev=506.578
w/o timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg= 99.9900, avg error= 10.018%, std dev= 0.364
Timer Queues : count= 10, avg= 99.0845, avg error= 7.364%, std dev= 1.839
Thread Pool Timer : count= 10, avg=100.0023, avg error= 7.468%, std dev= 1.612
Waitable Timer : count= 9, avg=101.0332, avg error= 8.131%, std dev= 6.021
SetTimer : count= 9, avg=110.0567, avg error= 9.012%, std dev= 0.772
Period: 50ms
Multi Media Timer : count= 19, avg= 50.0053, avg error= 4.980%, std dev= 0.166
Timer Queues : count= 20, avg= 50.0053, avg error= 10.016%, std dev= 7.735
Thread Pool Timer : count= 20, avg= 50.1440, avg error= 9.493%, std dev= 8.129
Waitable Timer : count= 19, avg= 50.0066, avg error= 12.866%, std dev= 5.455
SetTimer : count= 16, avg= 63.0847, avg error= 27.350%, std dev= 3.450
Period: 20ms
Multi Media Timer : count= 49, avg= 20.0010, avg error= 2.112%, std dev= 0.863
Timer Queues : count= 49, avg= 19.7819, avg error= 31.542%, std dev= 12.226
Thread Pool Timer : count= 50, avg= 20.0025, avg error= 31.515%, std dev= 15.630
Waitable Timer : count= 50, avg= 20.0014, avg error= 31.519%, std dev= 15.618
SetTimer : count= 31, avg= 31.3598, avg error= 52.433%, std dev= 2.734
Period: 10ms
Multi Media Timer : count= 99, avg= 9.9933, avg error= 2.477%, std dev= 2.325
Timer Queues : count= 65, avg= 15.6244, avg error= 58.679%, std dev= 0.808
Thread Pool Timer : count= 64, avg= 15.6262, avg error= 56.274%, std dev= 0.566
Waitable Timer : count= 64, avg= 15.6260, avg error= 56.271%, std dev= 0.542
SetTimer : count= 63, avg= 15.6670, avg error= 54.637%, std dev= 5.118
Period: 5ms
Multi Media Timer : count= 199, avg= 4.9971, avg error= 5.072%, std dev= 5.996
Timer Queues : count= 64, avg= 15.6247, avg error= 212.489%, std dev= 1.359
Thread Pool Timer : count= 64, avg= 15.6283, avg error= 212.633%, std dev= 1.221
Waitable Timer : count= 65, avg= 15.6261, avg error= 217.426%, std dev= 1.213
SetTimer : count= 63, avg= 15.6286, avg error= 207.760%, std dev= 1.211
Period: 2ms
Multi Media Timer : count= 499, avg= 2.0002, avg error= 5.749%, std dev= 11.303
Timer Queues : count= 64, avg= 15.6257, avg error= 681.319%, std dev= 3.766
Thread Pool Timer : count= 63, avg= 15.6277, avg error= 669.311%, std dev= 3.218
Waitable Timer : count= 63, avg= 15.6281, avg error= 669.344%, std dev= 2.800
SetTimer : count= 63, avg= 15.6259, avg error= 669.128%, std dev= 2.669
Period: 1ms
Multi Media Timer : count=1000, avg= 1.0004, avg error= 7.333%, std dev= 17.882
Timer Queues : count= 63, avg= 15.6286, avg error=1438.795%, std dev= 6.414
Thread Pool Timer : count= 64, avg= 15.6261, avg error=1462.726%, std dev= 6.689
Waitable Timer : count= 63, avg= 15.7792, avg error=1468.588%, std dev=121.221
SetTimer : count= 63, avg= 15.8166, avg error=1476.040%, std dev=216.244
w/ timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg=100.0024, avg error= 9.996%, std dev= 0.010
Timer Queues : count= 8, avg=100.0689, avg error= 19.890%, std dev= 0.173
Thread Pool Timer : count= 9, avg= 99.9989, avg error= 10.002%, std dev= 0.004
Waitable Timer : count= 9, avg=100.0008, avg error= 9.999%, std dev= 0.221
SetTimer : count= 9, avg=109.0484, avg error= 7.024%, std dev= 2.618
Period: 50ms
Multi Media Timer : count= 19, avg= 50.0000, avg error= 5.000%, std dev= 0.003
Timer Queues : count= 19, avg= 49.9972, avg error= 5.011%, std dev= 0.196
Thread Pool Timer : count= 19, avg= 49.9995, avg error= 5.002%, std dev= 0.200
Waitable Timer : count= 19, avg= 50.0000, avg error= 5.000%, std dev= 0.186
SetTimer : count= 15, avg= 62.3334, avg error= 16.564%, std dev= 2.366
Period: 20ms
Multi Media Timer : count= 49, avg= 20.0000, avg error= 2.332%, std dev= 1.735
Timer Queues : count= 50, avg= 19.9998, avg error= 0.011%, std dev= 0.015
Thread Pool Timer : count= 49, avg= 20.0004, avg error= 2.399%, std dev= 1.596
Waitable Timer : count= 49, avg= 20.0000, avg error= 2.120%, std dev= 0.812
SetTimer : count= 31, avg= 31.2263, avg error= 51.137%, std dev= 9.073
Period: 10ms
Multi Media Timer : count= 99, avg= 10.0002, avg error= 1.028%, std dev= 0.267
Timer Queues : count= 100, avg= 9.9999, avg error= 0.755%, std dev= 2.852
Thread Pool Timer : count= 99, avg= 10.0001, avg error= 1.169%, std dev= 1.158
Waitable Timer : count= 99, avg= 10.0000, avg error= 1.663%, std dev= 2.424
SetTimer : count= 63, avg= 15.4762, avg error= 53.127%, std dev= 42.746
Period: 5ms
Multi Media Timer : count= 199, avg= 5.0001, avg error= 1.719%, std dev= 4.868
Timer Queues : count= 200, avg= 5.0037, avg error= 0.682%, std dev= 2.096
Thread Pool Timer : count= 199, avg= 5.0001, avg error= 1.593%, std dev= 4.415
Waitable Timer : count= 199, avg= 5.0000, avg error= 4.443%, std dev= 17.939
SetTimer : count= 63, avg= 15.6032, avg error= 206.759%, std dev= 95.535
Period: 2ms
Multi Media Timer : count= 499, avg= 2.0024, avg error= 2.600%, std dev= 11.490
Timer Queues : count= 500, avg= 1.9999, avg error= 2.952%, std dev= 11.559
Thread Pool Timer : count= 499, avg= 2.0000, avg error= 3.584%, std dev= 12.828
Waitable Timer : count= 499, avg= 2.0000, avg error= 3.210%, std dev= 11.308
SetTimer : count= 63, avg= 15.5396, avg error= 660.664%, std dev=227.952
Period: 1ms
Multi Media Timer : count= 999, avg= 1.0000, avg error= 3.842%, std dev= 19.103
Timer Queues : count=1000, avg= 1.0002, avg error= 5.515%, std dev= 22.550
Thread Pool Timer : count= 999, avg= 1.0003, avg error= 3.639%, std dev= 17.089
Waitable Timer : count= 985, avg= 1.0145, avg error= 5.933%, std dev= 25.401
SetTimer : count= 63, avg= 15.6190, avg error=1436.902%, std dev=454.821
w/o timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg=100.0000, avg error= 10.000%, std dev= 0.007
Timer Queues : count= 10, avg= 99.8410, avg error= 7.518%, std dev= 1.287
Thread Pool Timer : count= 10, avg= 99.8408, avg error= 7.565%, std dev= 1.296
Waitable Timer : count= 10, avg= 99.8403, avg error= 7.540%, std dev= 1.285
SetTimer : count= 9, avg=109.2021, avg error= 7.326%, std dev= 0.028
Period: 50ms
Multi Media Timer : count= 19, avg= 50.0000, avg error= 5.000%, std dev= 0.017
Timer Queues : count= 20, avg= 49.9057, avg error= 10.158%, std dev= 7.618
Thread Pool Timer : count= 19, avg= 49.9106, avg error= 13.016%, std dev= 3.374
Waitable Timer : count= 20, avg= 49.9029, avg error= 10.280%, std dev= 7.425
SetTimer : count= 16, avg= 62.4008, avg error= 24.604%, std dev= 0.037
Period: 20ms
Multi Media Timer : count= 49, avg= 20.0003, avg error= 1.997%, std dev= 0.025
Timer Queues : count= 50, avg= 20.0035, avg error= 30.906%, std dev= 15.771
Thread Pool Timer : count= 51, avg= 19.8826, avg error= 32.108%, std dev= 17.570
Waitable Timer : count= 50, avg= 19.9623, avg error= 31.182%, std dev= 15.120
SetTimer : count= 31, avg= 31.1993, avg error= 50.877%, std dev= 0.111
Period: 10ms
Multi Media Timer : count= 99, avg= 9.9054, avg error= 3.196%, std dev= 9.966
Timer Queues : count= 102, avg= 9.9442, avg error= 73.402%, std dev= 21.392
Thread Pool Timer : count= 101, avg= 9.8853, avg error= 71.605%, std dev= 22.610
Waitable Timer : count= 64, avg= 15.6000, avg error= 55.751%, std dev= 7.632
SetTimer : count= 63, avg= 15.6011, avg error= 53.338%, std dev= 0.305
Period: 5ms
Multi Media Timer : count= 199, avg= 4.9447, avg error= 3.286%, std dev= 10.166
Timer Queues : count= 205, avg= 4.9464, avg error= 136.510%, std dev= 54.902
Thread Pool Timer : count= 202, avg= 4.9440, avg error= 134.983%, std dev= 52.510
Waitable Timer : count= 65, avg= 15.6001, avg error= 216.370%, std dev= 13.328
SetTimer : count= 64, avg= 15.5999, avg error= 211.495%, std dev= 5.019
Period: 2ms
Multi Media Timer : count= 500, avg= 1.9700, avg error= 4.135%, std dev= 13.594
Timer Queues : count= 499, avg= 2.0014, avg error= 174.153%, std dev=194.395
Thread Pool Timer : count= 506, avg= 1.9735, avg error= 172.604%, std dev=193.527
Waitable Timer : count= 65, avg= 15.5993, avg error= 690.850%, std dev= 35.720
SetTimer : count= 64, avg= 15.6002, avg error= 678.769%, std dev= 1.028
Period: 1ms
Multi Media Timer : count=1000, avg= 0.9850, avg error= 6.113%, std dev= 20.545
Timer Queues : count=1015, avg= 1.0000, avg error= 187.594%, std dev=336.914
Thread Pool Timer : count=1029, avg= 0.9857, avg error= 186.939%, std dev=336.261
Waitable Timer : count= 65, avg= 15.5999, avg error=1481.819%, std dev= 2.651
SetTimer : count= 65, avg= 15.6002, avg error=1481.875%, std dev= 74.922
w/ timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg= 99.8987, avg error= 10.182%, std dev= 0.514
Timer Queues : count= 9, avg=100.0163, avg error= 9.971%, std dev= 0.367
Thread Pool Timer : count= 10, avg= 99.9914, avg error= 0.183%, std dev= 0.308
Waitable Timer : count= 9, avg= 99.9975, avg error= 10.005%, std dev= 0.493
SetTimer : count= 8, avg=109.3769, avg error= 4.294%, std dev= 3.046
Period: 50ms
Multi Media Timer : count= 19, avg= 50.0028, avg error= 4.989%, std dev= 0.811
Timer Queues : count= 18, avg= 50.0401, avg error= 9.856%, std dev= 0.756
Thread Pool Timer : count= 19, avg= 49.9978, avg error= 5.008%, std dev= 0.290
Waitable Timer : count= 19, avg= 50.0504, avg error= 4.808%, std dev= 0.814
SetTimer : count= 15, avg= 62.4293, avg error= 16.922%, std dev= 1.611
Period: 20ms
Multi Media Timer : count= 50, avg= 19.9949, avg error= 0.694%, std dev= 1.288
Timer Queues : count= 49, avg= 19.9994, avg error= 2.162%, std dev= 1.042
Thread Pool Timer : count= 49, avg= 19.9999, avg error= 2.090%, std dev= 0.595
Waitable Timer : count= 49, avg= 19.9940, avg error= 2.221%, std dev= 1.124
SetTimer : count= 31, avg= 31.3076, avg error= 51.925%, std dev= 9.499
Period: 10ms
Multi Media Timer : count= 99, avg= 9.9906, avg error= 1.867%, std dev= 2.147
Timer Queues : count= 99, avg= 9.9905, avg error= 1.942%, std dev= 1.992
Thread Pool Timer : count= 99, avg= 9.9997, avg error= 1.300%, std dev= 1.506
Waitable Timer : count= 99, avg= 9.9997, avg error= 1.226%, std dev= 1.067
SetTimer : count= 63, avg= 15.5384, avg error= 53.507%, std dev= 47.915
Period: 5ms
Multi Media Timer : count= 199, avg= 5.0001, avg error= 0.745%, std dev= 1.699
Timer Queues : count= 199, avg= 4.9952, avg error= 1.276%, std dev= 3.149
Thread Pool Timer : count= 199, avg= 5.0001, avg error= 0.749%, std dev= 1.694
Waitable Timer : count= 199, avg= 5.0001, avg error= 1.285%, std dev= 3.320
SetTimer : count= 63, avg= 15.5373, avg error= 204.173%, std dev= 99.389
Period: 2ms
Multi Media Timer : count= 499, avg= 1.9998, avg error= 4.666%, std dev= 11.551
Timer Queues : count= 499, avg= 2.0000, avg error= 2.607%, std dev= 9.545
Thread Pool Timer : count= 500, avg= 2.0000, avg error= 5.222%, std dev= 12.641
Waitable Timer : count= 499, avg= 2.0020, avg error= 5.052%, std dev= 11.958
SetTimer : count= 63, avg= 15.6529, avg error= 671.790%, std dev=251.081
Period: 1ms
Multi Media Timer : count=1000, avg= 1.0007, avg error= 0.301%, std dev= 0.532
Timer Queues : count= 999, avg= 1.0007, avg error= 0.260%, std dev= 0.848
Thread Pool Timer : count= 999, avg= 1.0007, avg error= 0.214%, std dev= 0.447
Waitable Timer : count=1000, avg= 1.0007, avg error= 0.224%, std dev= 0.298
SetTimer : count= 63, avg= 15.5656, avg error=1426.421%, std dev=491.685
w/o timeBeginPeriod():
Period: 100ms
Multi Media Timer : count= 9, avg=100.0669, avg error= 9.880%, std dev= 0.002
Timer Queues : count= 9, avg= 98.9785, avg error= 11.829%, std dev= 6.930
Thread Pool Timer : count= 9, avg= 98.9505, avg error= 11.879%, std dev= 6.964
Waitable Timer : count= 9, avg=100.6981, avg error= 8.739%, std dev= 7.465
SetTimer : count= 9, avg=108.5452, avg error= 7.481%, std dev= 2.105
Period: 50ms
Multi Media Timer : count= 19, avg= 50.0124, avg error= 4.953%, std dev= 0.437
Timer Queues : count= 19, avg= 50.1676, avg error= 12.443%, std dev= 3.581
Thread Pool Timer : count= 19, avg= 49.3438, avg error= 12.910%, std dev= 1.910
Waitable Timer : count= 19, avg= 49.3450, avg error= 12.904%, std dev= 1.911
SetTimer : count= 16, avg= 61.9325, avg error= 22.740%, std dev= 4.529
Period: 20ms
Multi Media Timer : count= 49, avg= 20.0116, avg error= 1.886%, std dev= 0.060
Timer Queues : count= 49, avg= 19.7711, avg error= 31.495%, std dev= 12.076
Thread Pool Timer : count= 48, avg= 19.8580, avg error= 31.889%, std dev= 10.526
Waitable Timer : count= 49, avg= 20.0904, avg error= 31.862%, std dev= 14.027
SetTimer : count= 31, avg= 31.2512, avg error= 51.379%, std dev= 0.192
Period: 10ms
Multi Media Timer : count= 99, avg= 10.0056, avg error= 0.900%, std dev= 0.224
Timer Queues : count= 63, avg= 15.6257, avg error= 53.823%, std dev= 0.315
Thread Pool Timer : count= 63, avg= 15.6257, avg error= 53.823%, std dev= 0.130
Waitable Timer : count= 63, avg= 15.6271, avg error= 53.851%, std dev= 0.150
SetTimer : count= 63, avg= 15.6243, avg error= 53.795%, std dev= 0.398
Period: 5ms
Multi Media Timer : count= 199, avg= 5.0030, avg error= 0.528%, std dev= 1.307
Timer Queues : count= 63, avg= 15.6254, avg error= 207.632%, std dev= 0.360
Thread Pool Timer : count= 63, avg= 15.6256, avg error= 207.642%, std dev= 0.301
Waitable Timer : count= 63, avg= 15.6257, avg error= 207.644%, std dev= 0.129
SetTimer : count= 63, avg= 15.6252, avg error= 207.625%, std dev= 0.304
Period: 2ms
Multi Media Timer : count= 499, avg= 2.0015, avg error= 1.419%, std dev= 7.135
Timer Queues : count= 63, avg= 15.6264, avg error= 669.186%, std dev= 1.065
Thread Pool Timer : count= 63, avg= 15.6270, avg error= 669.240%, std dev= 2.498
Waitable Timer : count= 64, avg= 15.6258, avg error= 681.326%, std dev= 1.608
SetTimer : count= 64, avg= 15.6238, avg error= 681.127%, std dev= 1.489
Period: 1ms
Multi Media Timer : count= 999, avg= 1.0007, avg error= 0.141%, std dev= 0.768
Timer Queues : count= 62, avg= 15.8776, avg error=1463.005%, std dev=205.352
Thread Pool Timer : count= 63, avg= 15.6256, avg error=1438.196%, std dev= 1.204
Waitable Timer : count= 63, avg= 15.6258, avg error=1438.250%, std dev= 1.362
SetTimer : count= 63, avg= 15.6591, avg error=1444.799%, std dev=118.433
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment