1s
1 000ms
1 000 000us
1 000 000 000ns
1 000 000 000 000ps
以上时间单位分别是秒、毫秒、微妙、纳秒、皮秒,弹指间我们可过了1亿纳秒哦
代码操作耗时周期表(由比目鱼bi2.com.cn出品,转载请注明)
操作 | 耗时 |
---|
1.L1 cache访问 | 1ns | 2.L2 cache访问 | 3ns | 3. L3 cache访问 | 12ns | 4. 一次访问内存64B | 50ns-80ns | 5.Numa跨节点访问损耗 | 18ns-40ns | 6.一次原子变量++ | 10ns-30ns | 7.内存屏障,一次java中volatile变量++ | 5ns-25ns | 8.一次最简单的系统调用耗时,比如getpid() | 1000ns | 9.一次调用sendto发送1000B耗时 | 6 000ns - 10 000ns | 10.进程调度周期,CFS,即时钟中断周期 | 1 000 000ns或4 000 000ns | 11.一次mutex lock耗时 | 这里是一个大大的分水领,文中细论 | 12.一次磁盘随机访问 | 7 000 000ns - 15 000 000ns | 13.一次SSD盘随机访问 | 150 000ns |
当前主流内存一次访问取64B耗时约在50-100ns的样子
numa架构下,跨节点访问内存约20%-60%的损耗,换算成时间约在18-40ns这个量级上
原子操作有:加、减、CAS操作,这些操作在汇编层面都能看到一条lock指令(intel上是lock,ARM是其它)实现,原子操作还有一条天然功能:内存屏障,关于原子操作详细介绍及如何测试耗时后续会细讲
这里特指java里面的volatile变量操作是内存屏障,c/c++里面的volatile是指每次变量操作都读或取自主存(注意主存包括L1、L2、L3 cache及内存,并不是单指内存)不是内存屏障操作,什么是内存屏障呢?
6000ns - 10 000ns|这个是走linux内核网络协议栈发送耗时,linux网络协议栈的耗时已经到了天怒地怒的地步,近10年来涌现了一批bypass的技术,如dpdk、netmap、xdp/ebpf、rdma等,相对于linux内核提升了几十甚至上百倍的速度,这意味着走linux内核网络协议栈需要100台服务才能hold住的事,换成新技术可能几台上十台就搞定了,当然能hold住这些技术的程序员也不便宜哦
|