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