I dug up an "old" link to a presentation on the history of CPU design the other day, and part of it comes to mind now.
He talked about how back in the early days ram and cpu was pretty much equal in clock. Thus if you could fit your program in ram, you could calculate how fast your program would run based on how many instructions you used to do things.
These days the cpu is many multiples fasters than ram, and thus cache misses is these days what disk access was back then. And because of how the cpu is now multiple cores, pipelines, and multiple tiers of cache, you can't simply sit down and step through the code to look for instruction bottle necks.
Never mind the layers upon layers of libs and whatsnot sitting between your program and the hardware.
Even games consoles are like this now, as they have turned into multimedia gateways. The last generation of consoles that came close was perhaps the PS2 and Gamecube (the Xbox was more a stripped down PC than a games console, and likely started the trend leading us to the present day).