static inline uint64_t get_ticks() {
uint64_t v;
asm volatile("isb; mrs %0, cntvct_el0; isb" : "=r"(v) : : "memory");
return v;
}
void bind_to_cpu(int cpu_id) {
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);
if (sched_setaffinity(0, sizeof(cpu_set_t), &cpuset) == -1) {
perror("sched_setaffinity");
} else {
printf("Thread successfully bound to CPU %d\n", cpu_id);
}
}
int get_current_cpu() {
int cpu = sched_getcpu();
if (cpu == -1) {
perror("sched_getcpu");
return -1;
}
return cpu;
}
uint64_t runner(int cmd) {
char buffer[3] = "su";
uint64_t t1 = get_ticks();
for (int i = 0; i < 10000; i++) {
syscall(45, buffer, cmd);
}
uint64_t t2 = get_ticks();
return t2 - t1;
}
int main(int argc, char *argv[]) {
// 绑定cpu核心, 避免切换cpu核心对结果的影响
bind_to_cpu(0);
uint64_t d1 = 0, d2 = 0;
for (int i = 0; i < 5; i++) {
d2 += runner(0x999 - i);
}
for (int i = 0; i < 5; i++) {
d1 += runner(0x1000 + i);
}
printf("Duration for cmd 0x1000: %lu tk\n", d1);
printf("Duration for cmd 0x500 : %lu tk\n", d2);
uint64_t diff = d1 > d2 ? d1 - d2 : d2 - d1;
printf("Delta percentage: %.2f%%\n",
(double)diff / ((double)(d1 + d2) / 2) * 100.0);
return 0;
}