1 /**
2 * Framework code for benchmarking individual functions.
3 *
4 * License:
5 * This Source Code Form is subject to the terms of
6 * the Mozilla Public License, v. 2.0. If a copy of
7 * the MPL was not distributed with this file, You
8 * can obtain one at http://mozilla.org/MPL/2.0/.
9 *
10 * Authors:
11 * Vladimir Panteleev <ae@cy.md>
12 */
13
14 module ae.sys.benchmark;
15 version(Windows):
16
17 import std.exception;
18 import core.memory;
19
20 import ae.sys.windows.imports;
21 mixin(importWin32!q{windows});
22
23 ulong rdtsc() { asm { rdtsc; } } /// Returns the result of the RDTSC instruction.
24
25 private ulong benchStartTime;
26
27 /// Begin benchmarking.
28 void benchStart()
29 {
30 GC.collect();
31 version(DOS) asm { cli; }
32 benchStartTime = rdtsc();
33 }
34
35 /// Finish benchmarking, and return the elapsed ticks.
36 ulong benchEnd()
37 {
38 auto time = rdtsc() - benchStartTime;
39 version(DOS) asm { sti; }
40 return time;
41 }
42
43 static this()
44 {
45 try
46 {
47 version(DOS)
48 {}
49 else
50 {
51 HANDLE proc = GetCurrentProcess();
52 HANDLE thr = GetCurrentThread();
53
54 HANDLE tok;
55 enforce(OpenProcessToken(proc, TOKEN_ADJUST_PRIVILEGES, &tok), "OpenProcessToken");
56
57 LUID luid;
58 enforce(LookupPrivilegeValue(null,
59 "SeIncreaseBasePriorityPrivilege",
60 &luid), "LookupPrivilegeValue");
61
62 TOKEN_PRIVILEGES tp;
63 tp.PrivilegeCount = 1;
64 tp.Privileges[0].Luid = luid;
65 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
66
67 AdjustTokenPrivileges(tok, FALSE, &tp, tp.sizeof, null, null);
68 enforce(GetLastError() == ERROR_SUCCESS, "AdjustTokenPrivileges");
69
70 enforce(SetPriorityClass(proc, REALTIME_PRIORITY_CLASS), "SetPriorityClass");
71 // enforce(SetPriorityClass(proc, HIGH_PRIORITY_CLASS), "SetPriorityClass");
72 enforce(SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL), "SetThreadPriority");
73
74 enforce(SetProcessAffinityMask(proc, 1), "SetProcessAffinityMask");
75 }
76 }
77 catch (Exception e)
78 {
79 import std.stdio;
80 writeln("Benchmark initialization error: ", e.msg);
81 }
82
83 GC.disable();
84 }