Я работаю в команде по созданию приложения .NET на C #, и мы постоянно сталкиваемся с этим. Есть профилировщик, но никто не мешает им пользоваться, потому что 1) это немного беспокоит, и 2) вывод сбивает с толку. Что я делаю, так это запускаю его в среде IDE, и пока он работает медлительно, я просто приостанавливаю его и спрашиваю, что он делает и почему, изучая стек вызовов.
Так как он медленнее, чем будет, это потому, что он делает некоторые вещи, которые будут удалены или сделаны по-другому. Эти вещи обычно состоят из вызовов функций, запрашивающих такие вещи, как: интернационализация строк, которые не нужно интернационализировать, многократная загрузка, инициализация структур данных, которые существуют только для полноты и будут заменены позже, разархивирование и архивирование более необходимо. Все они принимают форму вызовов функций / методов среднего стека, и когда они обнаруживаются в нескольких выборках стека, они просто плачут, чтобы их обслуживали.
Хорошо бы попытаться предвидеть эти проблемы и не ставить их, но вы можете рассчитывать на такие проблемы, несмотря на благие намерения. Метод выборки из стека (стековые выстрелы) эффективен при их поиске.