Проблема профилировщика VC6: ложные вызовы функций - PullRequest
1 голос
/ 02 июля 2010

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

int SomeClass::getId() const
{
   return m_iId;
};

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

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 02 июля 2010

Я предполагаю, что происходит то, что компилятор и / или компоновщик «объединяют» эту очень простую функцию с одной или несколькими другими функциями, которые идентичны (код, сгенерированный для return m_iId, вероятно, точно такой же, как много других получателей, которые возвращают члена с таким же смещением).

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

Вы можете остановить это (если это проблема), отключив оптимизацию.

0 голосов
/ 03 июля 2010

Я предполагаю, что вы профилируете, потому что вы хотите узнать, есть ли способы заставить программу занимать меньше времени, верно?Вы не просто профилируете, потому что вам нравится видеть цифры.

Существует простой, старомодный, проверенный способ найти проблемы с производительностью.Пока программа работает, просто нажмите кнопку «пауза» и посмотрите на стек вызовов.Сделайте это несколько раз, например, от 5 до 20 раз.Чем больше проблема, тем меньше образцов вам нужно найти.

Некоторые люди спрашивают, не является ли это в основном тем, что делают профилировщики, и ответа очень мало. Большинство профилировщиков относятся к одному или нескольким распространенным мифам , в результате чего ваше ускорение ограничено, поскольку они не находят все проблемы:

  • Некоторые программы тратят ненужныевремя в "горячих точках".В этом случае вы увидите, что код на «конце» стека (где находится счетчик программ) выполняет ненужную работу.

  • Некоторые программы выполняют больше операций I /О чем нужно.Если это так, вы увидите, что они находятся в процессе ввода-вывода.

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

Любой код, который вы видите в некотором проценте стеков, в случае удаления сохранит этот процент времени выполнения (более или менее).).Вы не можете пойти не так. Вот пример , за несколько итераций, экономия более 97%.

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