From: Waldemar Kozaczuk <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> Branch: master
tests: add misc-vdso-perf.c to measure performance of VDSO This patch adds a simple test program intended to measure performance of VDSO based functions like clock_gettime(), gettimeofday() and time(). It will be useful to evaluate overhead of future changes to support running statically linked executables on OSv. Signed-off-by: Waldemar Kozaczuk <[email protected]> --- diff --git a/modules/tests/Makefile b/modules/tests/Makefile --- a/modules/tests/Makefile +++ b/modules/tests/Makefile @@ -139,7 +139,8 @@ tests := tst-pthread.so misc-ramdisk.so tst-vblk.so tst-bsd-evh.so \ libtls.so libtls_gold.so tst-tls.so tst-tls-gold.so tst-tls-pie.so \ tst-sigaction.so tst-syscall.so tst-ifaddrs.so tst-getdents.so \ tst-netlink.so misc-zfs-io.so misc-zfs-arc.so tst-pthread-create.so \ - misc-futex-perf.so misc-syscall-perf.so tst-brk.so tst-reloc.so + misc-futex-perf.so misc-syscall-perf.so tst-brk.so tst-reloc.so \ + misc-vdso-perf.so # libstatic-thread-variable.so tst-static-thread-variable.so \ # tst-f128.so \ diff --git a/tests/misc-vdso-perf.c b/tests/misc-vdso-perf.c --- a/tests/misc-vdso-perf.c +++ b/tests/misc-vdso-perf.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 Waldemar Kozaczuk + * + * This work is open source software, licensed under the terms of the + * BSD license as described in the LICENSE file in the top-level directory. + */ + +/* Simple test program intended to measure performance of VDSO + based functions like clock_gettime(), gettimeofday() and time(). + It will be useful to evaluate overhead of future changes to support + running statically linked executables on OSv. + + - build as static executable: + gcc -o misc-vdso-perf-static tests/misc-vdso-perf.c -static + + - build as static PIE: + gcc -o misc-vdso-perf-static-pie tests/misc-vdso-perf.c -pie -static-pie +*/ + +#define _GNU_SOURCE +#include <stdio.h> +#include <syscall.h> +#include <assert.h> +#include <stdint.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/time.h> +#include <time.h> + +uint64_t nstime() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t mul = 1000000000, mul2 = 1000; + return tv.tv_sec * mul + tv.tv_usec * mul2; +} + +int main(int argc, char **argv) +{ + long count = 50000000; + long loop = count; + uint64_t start = nstime(); + + struct timespec ts1; + while (loop--) { + assert(0 == clock_gettime(CLOCK_MONOTONIC, &ts1)); + } + + uint64_t end = nstime(); + + long average_syscall_duration = (end - start) / count; + printf("%lu ns (elapsed %.2f sec) %s\n", average_syscall_duration, (end - start) / 1000000000.0, ": average clock_gettime duration"); +} + -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/0000000000005c75cc0607c447d3%40google.com.
