@@ -76,191 +76,6 @@ std::string StrFormat(const char* format, ...) {
76
76
return buf;
77
77
}
78
78
79
- bool benchmark_running = false ;
80
- int64_t benchmark_real_time_us = 0 ;
81
- int64_t benchmark_cpu_time_us = 0 ;
82
- std::string* benchmark_label = nullptr ;
83
- int64_t benchmark_bytes_processed = 0 ;
84
-
85
- void ResetBenchmarkTiming () {
86
- benchmark_real_time_us = 0 ;
87
- benchmark_cpu_time_us = 0 ;
88
- }
89
-
90
- #ifdef WIN32
91
- LARGE_INTEGER benchmark_start_real;
92
- FILETIME benchmark_start_cpu;
93
- #else // WIN32
94
- struct timeval benchmark_start_real;
95
- struct rusage benchmark_start_cpu;
96
- #endif // WIN32
97
-
98
- void StartBenchmarkTiming () {
99
- #ifdef WIN32
100
- QueryPerformanceCounter (&benchmark_start_real);
101
- FILETIME dummy;
102
- CHECK (GetProcessTimes (
103
- GetCurrentProcess (), &dummy, &dummy, &dummy, &benchmark_start_cpu));
104
- #else
105
- gettimeofday (&benchmark_start_real, NULL );
106
- if (getrusage (RUSAGE_SELF, &benchmark_start_cpu) == -1 ) {
107
- std::perror (" getrusage(RUSAGE_SELF)" );
108
- std::exit (1 );
109
- }
110
- #endif
111
- benchmark_running = true ;
112
- }
113
-
114
- void StopBenchmarkTiming () {
115
- if (!benchmark_running) {
116
- return ;
117
- }
118
-
119
- #ifdef WIN32
120
- LARGE_INTEGER benchmark_stop_real;
121
- LARGE_INTEGER benchmark_frequency;
122
- QueryPerformanceCounter (&benchmark_stop_real);
123
- QueryPerformanceFrequency (&benchmark_frequency);
124
-
125
- double elapsed_real = static_cast <double >(
126
- benchmark_stop_real.QuadPart - benchmark_start_real.QuadPart ) /
127
- benchmark_frequency.QuadPart ;
128
- benchmark_real_time_us += elapsed_real * 1e6 + 0.5 ;
129
-
130
- FILETIME benchmark_stop_cpu, dummy;
131
- CHECK (GetProcessTimes (
132
- GetCurrentProcess (), &dummy, &dummy, &dummy, &benchmark_stop_cpu));
133
-
134
- ULARGE_INTEGER start_ulargeint;
135
- start_ulargeint.LowPart = benchmark_start_cpu.dwLowDateTime ;
136
- start_ulargeint.HighPart = benchmark_start_cpu.dwHighDateTime ;
137
-
138
- ULARGE_INTEGER stop_ulargeint;
139
- stop_ulargeint.LowPart = benchmark_stop_cpu.dwLowDateTime ;
140
- stop_ulargeint.HighPart = benchmark_stop_cpu.dwHighDateTime ;
141
-
142
- benchmark_cpu_time_us +=
143
- (stop_ulargeint.QuadPart - start_ulargeint.QuadPart + 5 ) / 10 ;
144
- #else // WIN32
145
- struct timeval benchmark_stop_real;
146
- gettimeofday (&benchmark_stop_real, NULL );
147
- benchmark_real_time_us +=
148
- 1000000 * (benchmark_stop_real.tv_sec - benchmark_start_real.tv_sec );
149
- benchmark_real_time_us +=
150
- (benchmark_stop_real.tv_usec - benchmark_start_real.tv_usec );
151
-
152
- struct rusage benchmark_stop_cpu;
153
- if (getrusage (RUSAGE_SELF, &benchmark_stop_cpu) == -1 ) {
154
- std::perror (" getrusage(RUSAGE_SELF)" );
155
- std::exit (1 );
156
- }
157
- benchmark_cpu_time_us += 1000000 * (benchmark_stop_cpu.ru_utime .tv_sec -
158
- benchmark_start_cpu.ru_utime .tv_sec );
159
- benchmark_cpu_time_us += (benchmark_stop_cpu.ru_utime .tv_usec -
160
- benchmark_start_cpu.ru_utime .tv_usec );
161
- #endif // WIN32
162
-
163
- benchmark_running = false ;
164
- }
165
-
166
- void SetBenchmarkLabel (const std::string& str) {
167
- if (benchmark_label) {
168
- delete benchmark_label;
169
- }
170
- benchmark_label = new std::string (str);
171
- }
172
-
173
- void SetBenchmarkBytesProcessed (int64_t bytes) {
174
- benchmark_bytes_processed = bytes;
175
- }
176
-
177
- struct BenchmarkRun {
178
- int64_t real_time_us;
179
- int64_t cpu_time_us;
180
- };
181
-
182
- struct BenchmarkCompareCPUTime {
183
- bool operator () (const BenchmarkRun& a, const BenchmarkRun& b) const {
184
- return a.cpu_time_us < b.cpu_time_us ;
185
- }
186
- };
187
-
188
- void Benchmark::Run () {
189
- for (int test_case_num = start_; test_case_num <= stop_; ++test_case_num) {
190
- // Run a few iterations first to find out approximately how fast
191
- // the benchmark is.
192
- const int kCalibrateIterations = 100 ;
193
- ResetBenchmarkTiming ();
194
- StartBenchmarkTiming ();
195
- (*function_)(kCalibrateIterations , test_case_num);
196
- StopBenchmarkTiming ();
197
-
198
- // Let each test case run for about 200ms, but at least as many
199
- // as we used to calibrate.
200
- // Run five times and pick the median.
201
- const int kNumRuns = 5 ;
202
- const int kMedianPos = kNumRuns / 2 ;
203
- int num_iterations = 0 ;
204
- if (benchmark_real_time_us > 0 ) {
205
- num_iterations = 200000 * kCalibrateIterations / benchmark_real_time_us;
206
- }
207
- num_iterations = std::max (num_iterations, kCalibrateIterations );
208
- BenchmarkRun benchmark_runs[kNumRuns ];
209
-
210
- for (int run = 0 ; run < kNumRuns ; ++run) {
211
- ResetBenchmarkTiming ();
212
- StartBenchmarkTiming ();
213
- (*function_)(num_iterations, test_case_num);
214
- StopBenchmarkTiming ();
215
-
216
- benchmark_runs[run].real_time_us = benchmark_real_time_us;
217
- benchmark_runs[run].cpu_time_us = benchmark_cpu_time_us;
218
- }
219
-
220
- std::string heading = StrFormat (" %s/%d" , name_.c_str (), test_case_num);
221
- std::string human_readable_speed;
222
-
223
- std::nth_element (benchmark_runs,
224
- benchmark_runs + kMedianPos ,
225
- benchmark_runs + kNumRuns ,
226
- BenchmarkCompareCPUTime ());
227
- int64_t real_time_us = benchmark_runs[kMedianPos ].real_time_us ;
228
- int64_t cpu_time_us = benchmark_runs[kMedianPos ].cpu_time_us ;
229
- if (cpu_time_us <= 0 ) {
230
- human_readable_speed = " ?" ;
231
- } else {
232
- int64_t bytes_per_second =
233
- benchmark_bytes_processed * 1000000 / cpu_time_us;
234
- if (bytes_per_second < 1024 ) {
235
- human_readable_speed =
236
- StrFormat (" %dB/s" , static_cast <int >(bytes_per_second));
237
- } else if (bytes_per_second < 1024 * 1024 ) {
238
- human_readable_speed = StrFormat (
239
- " %.1fkB/s" , bytes_per_second / 1024 .0f );
240
- } else if (bytes_per_second < 1024 * 1024 * 1024 ) {
241
- human_readable_speed = StrFormat (
242
- " %.1fMB/s" , bytes_per_second / (1024 .0f * 1024 .0f ));
243
- } else {
244
- human_readable_speed = StrFormat (
245
- " %.1fGB/s" , bytes_per_second / (1024 .0f * 1024 .0f * 1024 .0f ));
246
- }
247
- }
248
-
249
- std::fprintf (stderr,
250
- #ifdef WIN32
251
- " %-18s %10I64d %10I64d %10d %s %s\n " ,
252
- #else
253
- " %-18s %10lld %10lld %10d %s %s\n " ,
254
- #endif
255
- heading.c_str (),
256
- static_cast <long long >(real_time_us * 1000 / num_iterations),
257
- static_cast <long long >(cpu_time_us * 1000 / num_iterations),
258
- num_iterations,
259
- human_readable_speed.c_str (),
260
- benchmark_label->c_str ());
261
- }
262
- }
263
-
264
79
#ifdef HAVE_LIBZ
265
80
266
81
ZLib::ZLib ()
0 commit comments