程序员应该知道的几个数字

一个好的程序员应该对系统性能了如指掌,知己知彼,方能百战不殆,这篇译文原文地址 就是这么个目的,对程序设计中的时间概念做了一个大致的纪录,来自于大名鼎鼎的Jeff Dean,不知道他的同学可以去Google一下。

1 写是耗时的

  • 存储需要事务,操作系统访问磁盘。
  • 访问磁盘意味着磁盘寻址。
  • 拇指原则:磁盘一次查询需要10ms。
  • 简单的计算公式: 1s/10ms = 100 seek/second 意思是说1秒钟最多查询100次随机或顺序读取,这要取决于你需要访问的数据大大小和形状,是否连续等,所以涉及到数据的时候一般都是批量操作,批量读和批量写,想想你写了一个下午的WORD没保存就断电了是为什么?

2 读的成本低

  • 读不需要事务,是常量时间。
  • 数据一般只从磁盘读一次就被缓存了。
  • 所有顺序读的中间的数据都是直接从内存里获取的,并没有访问磁盘。
  • 拇指原则:从内存读1M数据出来需要250微秒。
  • 简单计算公式:1s/250usec = 4000,这意味着大概 4GB/S,内存速度。
  • 对于一个1MB的数据,1秒钟大约4000次读取。

3 一组数字

这组数字是jeff dean 在谷歌的一次给所有工程师的会议PDF中提取的。Jeff Dean的PDF

1 second = 1000 mills seconds = 1,000,000 微秒 = 1,000,000,000 纳秒

  • L1缓存访问0.5纳秒
  • 一次分支判断5纳秒
  • L2缓存访问7纳秒
  • 加锁和解锁100纳秒
  • 主内存访问100纳秒
  • 使用Zippy压缩1K数据需要10,000纳秒 = 10 微秒 = 0.001毫秒
  • 使用1Gbps的网络发送2K数据需要 250,000纳秒 = 250微秒 = 0.25毫秒
  • 在同一个数据中心中数据来回一次需要 500,000纳秒 = 500微秒 = 0.5毫秒
  • 磁盘访问一次需要10,000,000纳秒= 10,000微秒 = 10毫秒 = 0.01秒
  • 从网络中读取1MB有序数据需要10,000,000纳秒 = 10,000微秒 = 10毫秒 = 0.01秒
  • 从磁盘上读取1MB有序数据需要30,000,000纳秒 = 30,000微秒 = 30毫秒 = 0.03秒
  • 数据报从加利福尼亚-》荷兰-》加利福尼亚 需要 150,000,000纳秒 = 150,000微秒 = 150毫秒 = 0.15秒

4 结论

  • 写操作比读操作贵40倍。
  • 全局分享数据很昂贵,对于分布式系统来说是一个基础限制。如果写操作很多,那么就会有很多的锁竞争和事务,导致程序变成线性执行并且极大的损害性能。
  • Architect for scaling writes
  • Optimize for low write contention
  • Optimize wide .Make writes as parallel as you can

希望能对大家有所帮助。转载请标示 http://hushengdong.com/2016/11/12/程序员应该知道的几个数字/#more