ACK: [PATCH 09/11] fwts: Use gettimeofday for cpu benchmark
Colin Ian King
colin.king at canonical.com
Tue May 26 09:42:09 UTC 2015
On 21/05/15 10:34, Jeremy Kerr wrote:
> Currently, we use time() to measure out one second of time for a CPU
> benchmark. This means we have to wait around one second for a new time
> value before performing the test, and means we have to assume that we've
> been running for about one second.
>
> This change uses gettimeofday() instead; this way, we don't need to wait
> before starting a test, and get millisecond resolution when calculating
> the performance value.
>
> Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
>
> ---
> src/lib/src/fwts_cpu.c | 26 ++++++++++++++------------
> 1 file changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/src/lib/src/fwts_cpu.c b/src/lib/src/fwts_cpu.c
> index a7cfd3d..743de63 100644
> --- a/src/lib/src/fwts_cpu.c
> +++ b/src/lib/src/fwts_cpu.c
> @@ -31,11 +31,11 @@
> #include <sys/types.h>
> #include <sys/syscall.h>
> #include <sys/wait.h>
> +#include <sys/time.h>
> #include <signal.h>
> #include <fcntl.h>
> #include <math.h>
> #include <sched.h>
> -#include <time.h>
>
> #include <linux/perf_event.h>
>
> @@ -373,12 +373,12 @@ int fwts_cpu_benchmark(
> const int cpu, /* CPU we want to measure performance */
> fwts_cpu_benchmark_result *result)
> {
> + struct timeval start, end, duration;
> unsigned long long perfctr_result;
> fwts_cpu_benchmark_result tmp;
> cpu_set_t mask, oldset;
> int perfctr, ncpus, rc;
> static bool warned;
> - time_t current;
> bool perf_ok;
>
> ncpus = fwts_cpu_enumerate();
> @@ -418,24 +418,24 @@ int fwts_cpu_benchmark(
> return FWTS_ERROR;
> }
>
> - /* Wait until we get a new second */
> - current = time(NULL);
> - while (current == time(NULL))
> - sched_yield();
> -
> if (perf_ok)
> perf_start_counter(perfctr);
> -
> - current = time(NULL);
> + gettimeofday(&start, NULL);
>
> /*
> * And burn some CPU cycles and get a bogo-compute like
> * loop count measure of CPU performance.
> */
> - do {
> + for (;;) {
> fwts_cpu_burn_cycles();
> +
> tmp.loops++;
> - } while (current == time(NULL));
> +
> + gettimeofday(&end, NULL);
> + timersub(&end, &start, &duration);
> + if (duration.tv_sec >= 1)
> + break;
> + }
>
> if (perf_ok)
> perf_stop_counter(perfctr);
> @@ -448,7 +448,9 @@ int fwts_cpu_benchmark(
> if (perf_ok) {
> rc = perf_read_counter(perfctr, &perfctr_result);
> if (rc == FWTS_OK) {
> - tmp.cycles = perfctr_result;
> + tmp.cycles = perfctr_result /
> + ((1.0 * duration.tv_usec / 1000000) +
> + duration.tv_sec);
> tmp.cycles_valid = true;
> } else {
> fwts_log_warning(fw, "failed to read perf counters");
>
Good improvement.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list