Я предлагаю очень простой метод (который я выучил, прочитав сообщения Майка Данлавея на SO):
Просто приостановите программу.
Сделайте это несколько раз, чтобы получить разумный образец. Если определенная функция занимает половину времени выполнения вашей программы, есть вероятность, что вы очень быстро поймаете ее в действии.
Если вы улучшите производительность этой функции на 50%, то вы только что увеличили общее время выполнения на 25%. И если вы обнаружите, что это даже не нужно вообще (я обнаружил несколько таких случаев за короткое время, когда я использовал этот метод), вы просто сократите время выполнения пополам.
Я должен признаться, что сначала я довольно скептически относился к эффективности этого подхода, но после попытки его в течение нескольких недель, я подсел.