Numbers Everyone Should Know | Everything is Data
Jeff Dean makes similar points in his
LADIS 2009 keynote (which I unfortunately wasn't able to attend). In particular, he gives a useful table of "Numbers Everyone Should Know" — that is, the cost of some fundamental operations:
Operation | Time (nsec) |
L1 cache reference | 0.5 |
Branch mispredict | 5 |
L2 cache reference | 7 |
Mutex lock/unlock | 25 |
Main memory reference | 100 |
Compress 1KB bytes with Zippy | 3,000 |
Send 2K bytes over 1 Gbps network | 20,000 |
Read 1MB sequentially from memory | 250,000 |
Roundtrip within same datacenter | 500,000 |
Disk seek | 10,000,000 |
Read 1MB sequentially from disk | 20,000,000 |
Send packet CA -> Netherlands -> CA | 150,000,000 |
Some useful figures that aren't in Dean's data can be found in this article
comparing NetBSD 2.0 and FreeBSD 5.3 from 2005. Approximating those figures, we get:
Operation | Time (nsec) |
System call overhead | 400 |
Context switch between processes | 3000 |
fork() (statically-linked binary) | 70,000 |
fork() (dynamically-linked binary) | 160,000 |
Update: This recent blog post examines the question of system call and context switch overhead in more detail. His figures suggest the best-case system call overhead is now only ~60 nsec (for Linux on Nehelem), and that context switches cost about 30 microseconds (30,000 nsec) — when you account for the cost of flushing CPU caches, that is probably pretty reasonable.
Read full article from
Numbers Everyone Should Know | Everything is Data