| 232 | |
| 233 | template<typename TQueue> |
| 234 | double runBenchmark(BenchmarkType benchmark, unsigned int randomSeed, double& out_Ops) |
| 235 | { |
| 236 | typedef unsigned long long counter_t; |
| 237 | |
| 238 | SystemTime start; |
| 239 | double result = 0; |
| 240 | volatile int forceNoOptimizeDummy; |
| 241 | |
| 242 | switch (benchmark) { |
| 243 | case bench_raw_add: { |
| 244 | const counter_t MAX = 100 * 1000; |
| 245 | out_Ops = MAX; |
| 246 | TQueue q(MAX); |
| 247 | int num = 0; |
| 248 | start = getSystemTime(); |
| 249 | for (counter_t i = 0; i != MAX; ++i) { |
| 250 | q.enqueue(num); |
| 251 | ++num; |
| 252 | } |
| 253 | result = getTimeDelta(start); |
| 254 | |
| 255 | int temp = -1; |
| 256 | q.try_dequeue(temp); |
| 257 | forceNoOptimizeDummy = temp; |
| 258 | } break; |
| 259 | case bench_raw_remove: { |
| 260 | const counter_t MAX = 100 * 1000; |
| 261 | out_Ops = MAX; |
| 262 | TQueue q(MAX); |
| 263 | int num = 0; |
| 264 | for (counter_t i = 0; i != MAX; ++i) { |
| 265 | q.enqueue(num); |
| 266 | ++num; |
| 267 | } |
| 268 | |
| 269 | int element = -1; |
| 270 | int total = 0; |
| 271 | num = 0; |
| 272 | start = getSystemTime(); |
| 273 | for (counter_t i = 0; i != MAX; ++i) { |
| 274 | bool success = q.try_dequeue(element); |
| 275 | assert(success && num++ == element); |
| 276 | UNUSED(success); |
| 277 | total += element; |
| 278 | } |
| 279 | result = getTimeDelta(start); |
| 280 | assert(!q.try_dequeue(element)); |
| 281 | forceNoOptimizeDummy = total; |
| 282 | } break; |
| 283 | case bench_empty_remove: { |
| 284 | const counter_t MAX = 2000 * 1000; |
| 285 | out_Ops = MAX; |
| 286 | TQueue q(MAX); |
| 287 | int total = 0; |
| 288 | start = getSystemTime(); |
| 289 | SimpleThread consumer([&]() { |
| 290 | int element; |
| 291 | for (counter_t i = 0; i != MAX; ++i) { |
nothing calls this directly
no test coverage detected