Как найти наименее оптимизированные части программы?

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

Это для проекта с использованием C ++ в Visual Studio 2008.


person DShook    schedule 02.12.2008    source источник
comment
Заголовок не соответствует тексту вопроса.   -  person Alastair    schedule 03.12.2008


Ответы (5)


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

person Greg    schedule 02.12.2008

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

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

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

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

person Airsource Ltd    schedule 02.12.2008

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

person Naveen    schedule 03.12.2008

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

person Mike Dunlavey    schedule 19.11.2009

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

person macbirdie    schedule 03.12.2008