Thank You, Callgrind!
I actually like fixing bugs and optimizing code. It's satisfying to simplify a piece of code while making it perform better and use less memory.
I'm a terrible guesser, though. I guess about where bottlenecks are correctly perhaps half of the time, and likely less often than that. To make the most of my available time, I need a good profiler.
Callgrind works like Valgrind (and it's part of the Valgrind tools now). Run your program through Callgrind as normal (
valgrind --tool=callgrind program_name opt1 ... optn); it will collect statistics about the run. Then run
callgrind_annotate on the output and see a nice report about where your program spends its time. Though this is only the most basic of Callgrind's features, it's often sufficed for me to find and fix true bottlenecks.
If you need more features, I hear that KCachegrind is a useful visualizer of Callgrind's statistics. I haven't used it enough to discuss its value.
Because of Callgrind, I spend more time optimizing bottlenecks than I do finding them. Thanks to its developers and all contributors!