每个程序员都应该知道的数字
Numbers every programmer should know

原始链接: https://samwho.dev/numbers/?fo

在编程中,有几个数字是每个程序员都应该熟悉的,因为它们影响代码的效率和性能。 一个重要的数字是延迟——指令或数据通过计算机处理器或网络等电子系统所需的时间。 以下是简要概述: 在粒度级别上,处理器中处理的每条指令都会经过各级缓存(称为 L1 和 L2)。 每个级别都需要时间才能进入; L1 缓存引用通常需要不到一纳秒 (ns),而 L2 缓存引用可能需要长达数百 ns。 此外,当使用线程同时执行多个任务时,分支错误预测会增加执行时间,因为在错误地预测分支结果后需要回溯错误的路径。 一般来说,对主存储器或存储设备的任何访问都会由于其高传输速率和寻道时间而引入显着的延迟。 为了更好地说明这些概念,这里有一些额外的示例:通过每秒 1 千兆位 (Gbps) 的网络发送 1 KB 可能需要大约数十微秒 (μs); 使用 Zippy 压缩 1 KB 数据通常会增加几毫秒 (ms)。 同时,从内存或 SSD 中顺序读取 1 MB 的延迟范围明显较低,介于数十微秒到数百毫秒之间,具体取决于系统配置。 另一方面,旋转 rust 驱动器的读取操作具有更大的可变性,范围从毫秒到秒。 跨单个数据中心的往返通常需要大约数十毫秒,而跨越国际边界会显着增加延迟。 然而,上述所有操作都需要在我们的直接环境之外进行最少的交互,但当连接相距数千英里的系统时,网络可能会增加额外的延迟。 最终,理解这些概念使我们能够编写针对速度进行优化的高效算法,同时牢记不同的硬件组件如何影响整体性能。

有趣的是,科林·斯科特提出的原始图表使用对数刻度,但仍然设法显示所有相关数据点,而不需要过度放大或缩小。 也许学习如何合并可扩展的日志轴可以为改进设计和易用性提供灵感。
相关文章

原文

Latency Numbers Every Programmer Should Know

Visualisation by samwho, based on the work of Colin Scott.

L1 cache reference
Branch mispredict
L2 cache reference
Mutex lock/unlock
Send 1K bytes over 1 Gbps network
Main memory reference
Compress 1K bytes with Zippy
Read 1 MB sequentially from memory
Read 4K randomly from SSD
Read 1 MB sequentially from SSD
Round trip within same datacenter
Read 1 MB sequentially from disk
Disk seek
Send packet CA->Netherlands->CA
联系我们 contact @ memedata.com