Skip to content
About
Main content

Latency numbers and back-of-the-envelope estimates

Which latency ratios should you carry in your head, and how do you check that a design can work before building it?

Latency numbers by order of magnitude

The point of this table is not to memorize it, but to see ratios. Remember one number and derive the others.

OperationRelative (1 cycle = 1)Human scale (1 cycle = 1 s)
Register / 1 cycle0.3 ns11 second
L1 cache1 ns33 seconds
Branch mispredict3–5 ns~1313 seconds
L2 cache4 ns1313 seconds
L3 cache15–20 ns601 minute
80–100 ns3005 minutes
Remote node150–200 ns60010 minutes
(effective)10–50 µs~100,0001 day
read80–100 µs300,0003.5 days
Same-rack 100–200 µs500,0006 days
Cross-AZ RTT0.5–2 ms3,000,0005 weeks
seek8–13 ms30,000,0001 year
S3 GET ()20–100 ms200,000,0006 years
Cross-continent RTT100–200 ms500,000,00016 years
Tape mount + position30 s – 4 min~10¹¹3,000 years
  • Ratios worth remembering: DRAM ≈ 100× L1. NVMe ≈ 1,000× DRAM. Same-rack network ≈ NVMe. S3 ≈ 1,000× NVMe. Cross-region ≈ 1,000× same-rack.
  • The human-scale column teaches the most. If a register access takes one second, an S3 GET takes six years. After that, "combine your object-store requests" feels obvious.
  • Look at the gaps, not the values. The two largest jumps are DRAM → storage (~1,000×) and same-region → cross-region (~100×). These are exactly where the architecture boundaries of real systems are: memory vs. disk, single-region vs. multi-region. Abstraction boundaries follow latency cliffs. That is not a coincidence.

Back-of-the-envelope estimation

Take this seriously: it is a design tool, not a party trick. An estimate correct within 10× tells you whether an architecture is possible, in five minutes instead of two weeks of prototyping.

Method:

  1. Find the dominant cost. One term usually dominates; ignore the rest.
  2. Use round numbers.
  3. Write units on every number. Units catch most errors automatically.
  4. Check against a physical limit.
  5. Give the answer as a range.

Numbers to know by heart:

  • 1 day ≈ 10⁵ seconds (86,400). 1 year ≈ 3 × 10⁷ seconds.
  • Memory: ~100 ns, ~50 GB/s per socket.
  • NVMe: ~100 µs, ~5 GB/s.
  • Network: ~100 µs in a rack, ~50 ms across a continent.
  • S3: ~50 ms to first byte, ~80 MB/s per connection.

Worked example: scan 10 TB of Parquet from S3

  • 10 TB = 10,000,000 MB at 80 MB/s per connection → 10,000,000 ÷ 80 = 125,000 connection-seconds.
  • With 100 parallel streams: 125,000 / 100 = 1,250 s ≈ 21 minutes.
  • With 1,000 streams: ~2 minutes.

But 1,000 × 80 MB/s = 80 GB/s of incoming data and decompression. One machine cannot do that: its memory is ~50–200 GB/s and decompression needs more. So the answer is: this is a multi-node bandwidth problem, and the limit is the cluster's total network, not S3. That took two minutes and changed the whole design.

The real job of an estimate is to disprove. It shows that an approach cannot work before you build it. "This needs 10 Gb/s per node and we have 1" ends the discussion. And when a later measurement differs from the estimate by more than ~10×, you have found something you do not understand, which is the most valuable result possible.