libtopo/test/test.c
2023-03-03 17:19:19 -05:00

108 lines
2.0 KiB
C

#include <stdint.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "topo.h"
#define S2NS (1000000000UL)
static inline uint64_t
get_uptime(void)
{
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
return ((uint64_t)tp.tv_sec * S2NS + (uint64_t)tp.tv_nsec);
}
void test(const char * case_name, struct timespec * ts)
{
uint64_t slow;
uint64_t fast;
slow = get_uptime();
if (nanosleep(ts, NULL) != 0) {
perror("nanosleep() interrupted!");
exit(-1);
}
slow = get_uptime() - slow;
fast = topo_uptime_ns();
if (nanosleep(ts, NULL) != 0) {
perror("nanosleep() interrupted!");
exit(-1);
}
fast = topo_uptime_ns() - fast;
printf("%s: clock_gettime(): %lu, topo_uptime_ns(): %lu, %% diff: %.2f%%\n", case_name, slow, fast, ((float)fast - (float)slow) / (float)slow * 100);
}
int ts_test(void)
{
struct timespec ts;
// 1s
ts.tv_nsec = 0;
ts.tv_sec = 1;
test("1s", &ts);
// 100ms
ts.tv_nsec = 100000000;
ts.tv_sec = 0;
test("100ms", &ts);
// 10ms
ts.tv_nsec = 10000000;
ts.tv_sec = 0;
test("10ms", &ts);
// 1ms
ts.tv_nsec = 1000000;
ts.tv_sec = 0;
test("1ms", &ts);
// 100us
ts.tv_nsec = 100000;
ts.tv_sec = 0;
test("100us", &ts);
// 10us
ts.tv_nsec = 10000;
ts.tv_sec = 0;
test("10us", &ts);
// 1us
ts.tv_nsec = 1000;
ts.tv_sec = 0;
test("1us", &ts);
// 100ns
ts.tv_nsec = 100;
ts.tv_sec = 0;
test("100ns", &ts);
// 10ns
ts.tv_nsec = 10;
ts.tv_sec = 0;
test("10ns", &ts);
// 1ns
ts.tv_nsec = 1;
ts.tv_sec = 0;
test("1ns", &ts);
return 0;
}
int main(void)
{
topo_init(1);
topo_init(1);
printf("Total cores: %d, numa: %d\n", topo_num_core(), topo_num_numa());
for (int i = 0; i < topo_num_core(); i++) {
printf("Core %d -> NUMA %d\n", i, topo_core_to_numa(i));
}
ts_test();
return 0;
}