setjmp/longjmp测试

使用s_jmp程序来测试setjmp的性能。1G次循环。下面是结论:

5.77,0.00,29,0,0,0,99%
5.70,0.00,30,0,0,0,99%
5.71,0.00,22,0,0,0,99%
5.71,0.00,23,0,0,0,99%
5.70,0.00,30,0,0,0,100%
5.70,0.00,23,0,0,0,99%

统计结果如下:

  • time mean = 5.715
  • time var = 0.000625

单次调度开销只有5.7ns,在所有测试中性能最优。(glibc-2.19/sysdeps/x86_64/setjmp.S)

getcontext/setcontext测试

使用s_context程序来测试setcontext的性能。100M次循环。下面是结论:

12.96,5.88,79,0,0,0,99%
13.13,5.94,105,0,0,0,99%
12.95,6.18,57,0,0,0,99%
13.13,5.90,64,0,0,0,99%
12.95,5.88,82,0,0,0,99%
12.96,5.80,51,0,0,0,99%

统计结果如下:

  • time mean = 13.01
  • time var = 0.0068

单次调度开销高达130ns,仅比系统的sched在高线程下略快。这事很奇怪,因为根据我看到的源码(glibc-2.19/sysdeps/unix/sysv/linux/x86_64/setcontext.S),getcontext/setcontext在glibc中是用汇编实现的。其中陷入内核只是为了设定signal mask。