缓存System.currentTimeMillis的调用
系统时间缓存的必要
除了网络服务器,监控系统和日志系统也会频繁的调用System.currentTimeMillis
。看公
司内部实现的异步日志中就对系统时间进行了缓存。
实现
测试
使用JMH
做一个benchmark
压力测试, JMH
在做测试之前会有预热的过程,以排
除jit
等因素的影响,在系统达到稳定运行的时候再去对比两个方法的调用。
1 | public static void main(String[] args) throws RunnerException { |
结果如下:
1 |
|
可以看到还是差了一个数量级,如果对时间的精度要求没有那么高,还是可以缓存下的。
查看调用的系统方法
使用strace
attach 到当前的进程,查看进程相应的调用
1 | sudo strace -p [pid] |
输出结果如下:
1 | ➜ sudo strace -p 15588 |
并没有看到具体的系统调用,查找原因发现:
这里使用 ltrace 是因为 linux 支持 VDSO 之后,gettimeofday 属于快速系统调用,使
用 strace 是看不到执行结果的。
What is actually happening here is that we are linking to the vDSO (virtual
dynamic shared object), which is a small fully relocatable shared library
pre-mapped into the user address space. The linking happens during the first
call of gettimeofday, after which the call is resolved, and the first indirect
jump goes straight into the function.
重新使用ltrace
查看:
命令:
1 | ➜ ~ sudo ltrace -c -S -p 16365 |
然而还是没有看到gettimeofday
的调用,具体原因不得而知。
结论
premature optimization is the root of all evil 过早优化是万恶之源
如果系统的性能能满足我们的要求,就不要过早的做这些优化 ; 系统优化之前需要先做
profiling,找到真正的瓶颈,在次之前需要保持系统的简单,可靠。