Repository navigation
Expand file tree
/
Copy pathbenchmark.c
More file actions
93 lines (84 loc) · 2.23 KB
/
Copy pathbenchmark.c
File metadata and controls
93 lines (84 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#define MINICORO_IMPL
#include "minicoro.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#if defined(__i386__)
static inline uint64_t rdtsc() {
uint64_t x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
#elif defined(__x86_64__)
static inline uint64_t rdtsc() {
uint32_t hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}
#elif defined(__aarch64__)
static inline uint64_t rdtsc() {
uint64_t val;
__asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val));
return val;
}
#endif
#define SWITCH_ITERATIONS 10000000
#define INIT_ITERATIONS 100000
void coro_entry(mco_coro* co) {
for(int i=0;i<SWITCH_ITERATIONS;++i) {
mco_yield(co);
}
}
void bench_switch() {
mco_desc desc = mco_desc_init(coro_entry, 0);
mco_coro* co;
mco_create(&co, &desc);
uint64_t start = rdtsc();
for(int i=0;i<SWITCH_ITERATIONS;++i) {
mco_resume(co);
}
uint64_t elapsed = rdtsc() - start;
mco_destroy(co);
printf("switch cycles %.1f\n", elapsed / (double)(SWITCH_ITERATIONS*2));
}
void bench_init() {
mco_desc desc = mco_desc_init(coro_entry, 0);
mco_coro* co = (mco_coro*)malloc(desc.coro_size);
uint64_t init_cycles = 0;
uint64_t uninit_cycles = 0;
uint64_t start;
for(int i=0;i<INIT_ITERATIONS;++i) {
start = rdtsc();
mco_init(co, &desc);
init_cycles += rdtsc() - start;
start = rdtsc();
mco_uninit(co);
uninit_cycles += rdtsc() - start;
}
free(co);
printf("init cycles %.1f\n", init_cycles / (double)(INIT_ITERATIONS));
printf("uninit cycles %.1f\n", uninit_cycles / (double)(INIT_ITERATIONS));
}
void bench_create() {
mco_desc desc = mco_desc_init(coro_entry, 0);
uint64_t create_cycles = 0;
uint64_t destroy_cycles = 0;
uint64_t start;
for(int i=0;i<INIT_ITERATIONS;++i) {
start = rdtsc();
mco_coro* co = NULL;
mco_create(&co, &desc);
create_cycles += rdtsc() - start;
start = rdtsc();
mco_destroy(co);
destroy_cycles += rdtsc() - start;
}
printf("create cycles %.1f\n", create_cycles / (double)(INIT_ITERATIONS));
printf("destroy cycles %.1f\n", destroy_cycles / (double)(INIT_ITERATIONS));
}
int main() {
bench_switch();
bench_init();
bench_create();
return 0;
}