Проблема профилирования VC6: Spurious Function Calls

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

  •  02-10-2019
  •  | 
  •  

Вопрос

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

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+ тысяч звонков! Просто чтобы убедиться, что это не было некоторых кэшированных профилировщиков данных или поврежденной поиска функций, я делаю чистый и восстановитель между каждым тестом. Тем не менее те же результаты!

Есть идеи?

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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