测量系统调用的和上下文切换的时间
- 测量系统调用时间
1亿次空读操作,测量平均的系统调用时间
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#define ITERATIONS 1e8
int main(void)
{
struct timeval start, end;
gettimeofday(&start, NULL);
for (int i = 0; i < ITERATIONS; i++)
read(0, NULL, 0);
gettimeofday(&end, NULL);
double elapsed_time = (end.tv_sec - start.tv_sec) * 1e6 + end.tv_usec - start.tv_usec;
printf("System call cost: %f\n", elapsed_time / ITERATIONS);
return 0;
}

系统调用的时间大概为 0.45 微秒
- 测量上下文切换的时间
创建两个管道,两个进程分别从不同的管道读写,当一个进程被阻塞的时候,就会进行进程切换
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>
#define ITERATIONS 1e6
static void set_cpu_affinity(int pid, int cpu_id)
{
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);
if (sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset) == -1) {
perror("sched_setaffinity failed");
}
}
int main(void)
{
int fd1[2], fd2[2];
pipe(fd1); /* Parent read, child write */
pipe(fd2); /* Parent write, child read */
set_cpu_affinity(0, 0);
pid_t pid = fork();
if (pid < 0) {
exit(1);
} else if (pid == 0) {
set_cpu_affinity(0, 0);
close(fd1[0]);
close(fd2[1]);
char buffer;
for (int i = 0; i < ITERATIONS; i++) {
write(fd1[1], &buffer, 1);
read(fd2[0], &buffer, 1);
}
close(fd1[1]);
close(fd2[0]);
exit(0);
} else {
struct timeval start, end;
gettimeofday(&start, NULL);
close(fd1[1]);
close(fd2[0]);
char buffer;
for (int i = 0; i < ITERATIONS; i++) {
read(fd1[0], &buffer, 1);
write(fd2[1], &buffer, 1);
}
close(fd1[0]);
close(fd1[1]);
gettimeofday(&end, NULL);
double elapsed_time = (end.tv_sec - start.tv_sec) * 1e6 + end.tv_usec - start.tv_usec;
printf("Context switch cost: %f\n", elapsed_time / ITERATIONS);
wait(NULL);
}
return 0;
}

上下文切换的时间大概是 3 微秒,扣除掉两次系统调用
posted on
浙公网安备 33010602011771号