| // Copyright © 2023 Apple Inc. | |
| template <typename F, typename... Args> | |
| double time_fn(F fn, Args&&... args) { | |
| // warmup | |
| for (int i = 0; i < 5; ++i) { | |
| eval(fn(std::forward<Args>(args)...)); | |
| } | |
| int num_iters = 100; | |
| auto start = time_now(); | |
| for (int i = 0; i < num_iters; i++) { | |
| eval(fn(std::forward<Args>(args)...)); | |
| } | |
| auto end = time_now(); | |
| return milliseconds(end - start) / static_cast<double>(num_iters); | |
| } | |