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

StackOverflow https://stackoverflow.com/questions/335494

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Затем проделайте это снова, и еще раз.

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

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


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

  • Путать вас с "эксклюзивным временем", которое, если вы сконцентрируетесь на информации линейного уровня, почти бессмысленно.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top