Как вы находите наименее оптимизированные части программы? - PullRequest
3 голосов
/ 03 декабря 2008

Существуют ли какие-либо инструменты для определения гистограммы, на которой тратится большая часть времени выполнения программы?

Это для проекта, использующего c ++ в visual studio 2008.

Ответы [ 5 ]

13 голосов
/ 03 декабря 2008

Ваше имя - профилировщик . Попробуйте Найти узкие места приложения с помощью Visual Studio Profiler

6 голосов
/ 03 декабря 2008

Вам нужен профилировщик .

В выпуск Visual Studio Team входит профилировщик (именно это вы и ищете), но у вас может быть доступ только к версиям Professional или Express. Посмотрите на эти темы для альтернатив:

Какой ваш любимый инструмент профилирования (для C ++) Какие хорошие профилировщики для родного C ++ в Windows?

Вы действительно не должны оптимизировать ЛЮБЫЕ части вашего приложения, пока вы не измерили, сколько времени они занимают. В противном случае вы можете направлять усилия в неправильное место, и вы можете ухудшать, а не улучшать ситуацию.

1 голос
/ 19 ноября 2009

Вы можете получить гистограмму счетчика программы, но она практически бесполезна, если вы не делаете что-то глупое, например, проводите время в виде пузыря большого массива целых или двойных чисел.

Если вы сделаете что-то столь же простое, как пузырьковая сортировка массива строк, гистограмма ПК покажет вам только то, что у вас есть горячая точка в процедуре сравнения строк. Это не очень помогает, не так ли?

Я знаю, что вы бы не делали такой пузырьковой сортировки, но просто для забавы, давайте предположим, что вы сделали, и это занимало 90% вашего времени. (то есть, если вы исправите это, оно может увеличиться в 10 раз.)

На самом деле это очень легко найти, потому что если вы просто нажмете кнопку паузы в отладчике, вы почти наверняка увидите, что она останавливается в процедуре сравнения строк. Затем, если вы посмотрите на стек на один уровень, вы будете смотреть прямо на цикл пузырьковой сортировки, который является вашей ошибкой. Если вы не уверены, что действительно заметили проблему, просто остановите ее несколько раз. Количество раз, когда вы видите проблему, говорит о том, насколько она дорогостоящая.

Любая строка кода, которая появляется в стеке вызовов при кратных паузах, требует от вас исправления. Некоторые из них вы не можете, например, «call _main», но если вы можете, вы получите хорошее ускорение, гарантировано.

Затем сделайте это снова и снова.

Если у вас закончились вещи, которые вы можете исправить, то вы действительно настроили программу в считанные секунды.

Это так просто.


Вы также можете использовать профилировщик в Visual Studio. Это хороший инструмент, но имейте в виду следующие недостатки:

  • Путать вас с «исключительным временем», которое, если вы концентрируетесь на информации на уровне строк, почти бессмысленно.

  • Если ваша программа тратит время на ввод / вывод, она этого не увидит, потому что, когда она прекращает делать ввод / вывод, сэмплы останавливаются, если вы не используете инструментарий.

  • Но если вы используете инструментарий, вы не получите информацию на уровне линии, только на уровне функции. Это нормально, если все ваши функции маленькие.

  • Смущает вас «деревом вызовов». Для строки кода важно, сколько образцов стека это на. Если оно находится во многих ветвях дерева вызовов, дерево вызовов не покажет вам, сколько оно действительно стоит.

  • Если он говорит вам, что линия дорогая, он не может сказать вам, почему. Для этого вы хотите видеть столько информации о состоянии каждого образца, сколько вам нужно, а не просто сводки.

  • Трудно сказать, когда вы хотите делать сэмплы, а когда нет. Вы хотите, чтобы оно выполняло выборку, когда вы ожидаете приложение, а не когда оно ждет вас.

1 голос
/ 03 декабря 2008

Я использовал профилировщик под названием «AQ Time», который дает все подробности о производительности вашего кода. Это не бесплатно, хотя ..

0 голосов
/ 03 декабря 2008

Итак, теперь, когда вы знаете, что вам нужен профилировщик, у вас может не быть Visual Studio, поэтому Very Sleepy может помочь.

...