What the compiler has to guess about your program, and what changes when it doesn’t have to. Profile-guided optimization on a toy interpreter and on SQLite.
What happens when a hot loop runs through more code than the instruction cache can hold, and why batching work is a design decision the compiler won’t make for you.
Summing a power-of-two-sized matrix column by column is eight times slower than the same loop with one extra element per row. Why cache sets make some addresses collide, and how to spot it.