| 28 | |
| 29 | template <std::size_t num_rounds, std::size_t num_entries, typename VectorT> |
| 30 | auto measure_random_access() |
| 31 | { |
| 32 | std::vector<std::size_t> indices(num_entries); |
| 33 | std::iota(indices.begin(), indices.end(), 0); |
| 34 | std::mt19937 g(1337); |
| 35 | std::shuffle(indices.begin(), indices.end(), g); |
| 36 | |
| 37 | VectorT vector(num_entries); |
| 38 | |
| 39 | TIMER_START(write); |
| 40 | for (auto round : util::irange<std::size_t>(0, num_rounds)) |
| 41 | { |
| 42 | for (auto idx : util::irange<std::size_t>(0, num_entries)) |
| 43 | { |
| 44 | vector[indices[idx]] = idx + round; |
| 45 | } |
| 46 | } |
| 47 | TIMER_STOP(write); |
| 48 | |
| 49 | TIMER_START(read); |
| 50 | auto sum = 0; |
| 51 | for (auto round : util::irange<std::size_t>(0, num_rounds)) |
| 52 | { |
| 53 | sum = round; |
| 54 | for (auto idx : util::irange<std::size_t>(0, num_entries)) |
| 55 | { |
| 56 | sum += vector[indices[idx]]; |
| 57 | } |
| 58 | dont_optimize_away(sum); |
| 59 | } |
| 60 | TIMER_STOP(read); |
| 61 | |
| 62 | return Measurement{TIMER_MSEC(write), TIMER_MSEC(read)}; |
| 63 | } |
| 64 | |
| 65 | int main(int, char **) |
| 66 | { |
nothing calls this directly
no test coverage detected