程序员应该了解的数字
来源:互联网 发布:maya软件手机版 编辑:程序博客网 时间:2024/04/29 04:37
- 写硬盘操作昂贵
- 读硬盘操作便宜
- 各种数据
- 经验
- 参考
几年前的一篇文章了,关于程序访问存储器所需时间的文章。对于程序访问cache、内存、硬盘、网络等设备,只是大概知道访问哪些设备快,哪些设备慢;具体多块或多慢,没有明确概念。现代的设备访问速度已经超过几年前,但是了解这些数值仍然有意义。
首先明确一下时间单位之间的换算关系:
秒(s)、毫秒(ms)、微秒 (μs)、纳秒(ns)之间关系为:
写硬盘操作“昂贵”
- 数据存储是事务类型:写操作要求访问硬盘
- 访问硬盘意味着磁盘寻道
- 经验法则:每次寻道耗时10ms
- 简单的数学计算: 1s / 10ms = 100 seeks /sec,即每秒最多100次寻道
- 具体依赖: 数据的大小和是否批量读取
读硬盘操作“便宜”
- 读操作不是事务类型
- 数据只需从硬盘读一次,之后很容易命中
- 后续的读直接从内存读取
- 经验法则: 从内存读1M数据需要250μs
- 简单数据计算: 1s / 250μs = 4GB/S,即每秒读4GB
- 对于1M的数据,每秒可以取4000次
各种数据
下面这组数据出自Jeff Dean在Google全体工程大会的报告。
- L1 cache的引用0.5ns
- Branch mispredict 5ns
- L2 cache的引用 7ns
- Mutex lock/unlock 100ns=0.1μs
- 引用主内存 100ns=0.1μs
- 使用Zippy压缩1kb数据 10,000 ns=10μs
- 1Gbps网卡,发送2kb数据 20,000ns=20μs
- 从内存连续读1M数据 250,000ns=250μs
- 一个数据中心内的round trip 500,000ns=500μs
- 磁盘寻道10,000,000ns=10ms
- 从网络连续读1M数据 10,000,000ns=10ms
- 发送包 CA->Netherlands->CA 150,000,000ns=150ms
经验
- 写操作比读操作慢40倍。
- 全局共享数据代价昂贵,这是分布式系统中基本的限制。在频繁写对象的操作中锁冲突降低了性能,使得事物变为序列操作,变慢。
- 构建写扩展
- 优化少量的写冲突
- 广度优化。使得写操作尽可能并行。
下面这张图比较形象展示了数值之间的对比关系:
参考
Numbers Everyone Should Know
Latency Numbers Every Programmer Should Know
阅读全文
1 0
- 程序员应该了解的数字
- 程序员应该了解的测试
- javascript的程序员都应该了解的
- 试用期程序员应该了解的事儿
- 试用期程序员应该了解的事儿
- 程序员应该了解的10种算法
- 初级程序员应该了解的Linux命令
- 初级程序员应该了解的Linux命令
- 程序员应该了解的幸福经济学
- 每个程序员的都应该了解的字符编码
- 每个程序员的都应该了解的字符编码
- JAVA程序员应该了解的10个JSP标签库
- JAVA程序员应该了解的10个JSP标签库
- 程序员应该了解的查找(java实现)
- 程序员应该了解的面向对象七大设计原则
- Java程序员应该了解的10个面向对象…
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识【第一部分】
- androidru使用adb启动activity和monkeyrunner启动activity
- HTTP协议简单认识
- 查看卸载CentOS的自带Java环境
- 数据结构之线性表
- 学习git用法
- 程序员应该了解的数字
- 移动APP测试--手工测试要点总结
- Unity Shader-Command Buffer的使用(景深与描边效果重置版)
- 过滤器
- @RequestBody笔记
- [实训]Java中final关键字的使用
- JS四种方法去除字符串最后的逗号
- linux下 获取帮助命令
- html5拖放--15行js代码实现两个div内容互换