Closed Appla closed 4 years ago
Linux 下, gettimeofday
系统调用是通过 vDSO 提供的,是不需要进入内核态的。
简单测试:https://3v4l.org/HEXFF ,时间缓存(近似 gc_enabled()
)能比 microtime
减少 70% 时间,但是 microtime
本身就很快了,感觉收益不大。
Swoole4底层正好移除了定时器时间缓存, 改为直接使用系统调用获取(理由同上), 性能方面没有太大差异(大到不可接受), 并且缓存的时间精度很差
在 Linux 系统下,time、microtime、gettimeofday 都已经被优化过了,没有系统调用,是直接读取内存的。
使用 C 代码进行测试,直接使用 time
函数和使用内存缓存,性能上没有任何差别。
#include <time.h>
int main() {
for (int i=0; i< 10000000; i++) {
time_t t = time(NULL);
}
return 0;
}
#include <time.h>
time_t g_time;
time_t get_time(void *ptr) {
if (ptr) {
return time(ptr);
}
return g_time;
}
int main() {
g_time = time(NULL);
for (int i=0; i< 10000000; i++) {
time_t t = get_time(NULL);
}
return 0;
}
swoole@LAPTOP-0K15EFQI:~/swoole/examples/debug$ gcc -O0 -o test2 t2.c
swoole@LAPTOP-0K15EFQI:~/swoole/examples/debug$ gcc -O0 -o test1 t1.c
swoole@LAPTOP-0K15EFQI:~/swoole/examples/debug$ time ./test1
real 0m0.050s
user 0m0.031s
sys 0m0.011s
swoole@LAPTOP-0K15EFQI:~/swoole/examples/debug$ time ./test2
real 0m0.053s
user 0m0.044s
sys 0m0.001s
swoole@LAPTOP-0K15EFQI:~/swoole/examples/debug$
背景
time
,microtime
,gettimeofday
都是通过系统调用获取时间的, 系统调用相对纯用户态取数据来说代价稍微昂贵需求
参考