Я никогда не делал профилирование. Вчера я запрограммировал класс ProfilingTimer со статическим расписанием (карта ) для хранения времени.
Конструктор сохраняет начальный тик, а деструктор вычисляет истекшее время и добавляет его на карту:
ProfilingTimer::ProfilingTimer(std::string name)
: mLocalNameLength(name.length())
{
sNestedName += name;
sNestedName += " > ";
mStartTick = Platform::GetTimerTicks();
}
ProfilingTimer::~ProfilingTimer()
{
long long totalTicks = Platform::GetTimerTicks() - mStartTick;
sTimetable[sNestedName] += totalTicks;
sNestedName.erase(sNestedName.length() - mLocalNameLength - 3);
}
В каждую функцию (или {блок}), которую я хочу профилировать, мне нужно добавить:
ProfilingTimer _ProfilingTimer("identifier");
Это профилирование отлично работает, когда я создаю версию выпуска из Visual C ++ 2010 Professional. Но когда я строю как Debug, я получаю огромное падение fps (с 63 до ~ 20).
Это числа, которые я получаю, когда печатаю свое расписание (отладочная сборка):
Update() > Tower::Update > : 2551 ms (84100m%)
Update() > Tower::Update > Tower::Update1 > : 1313 ms (43284m%)
Update() > Tower::Update > Tower::Update1 > Tower::FindNewTarget > : 6 ms (204m%)
Update() > Tower::Update > Tower::Update1 > Tower::HasTargetInRange > : 5 ms (184m%)
Update() > Tower::Update > Tower::Update2 > : 659 ms (21756m%)
Update() > Tower::Update > Tower::Update2 > Tower::HasTargetInRange > : 5 ms (187m%)
Update1 и Update2 умножены на первую и вторую половину соответственно Update. Почему они не составляют до 84,1%?
Тем не менее эти 84% являются огромным числом - при сборке релиза я получаю такой вывод:
Update() > : 770 ms (1549m%)
Update() > Tower::Update > : 722 ms (1452m%)
Update() > Tower::Update > Tower::FindNewTarget > : 44 ms (89m%)
Update() > Tower::Update > Tower::HasTargetInRange > : 92 ms (187m%)
1,4% вместо 84,1%. Это огромная разница!
Кто-нибудь знает почему?
РЕДАКТИРОВАТЬ: я думаю, что выпуск намного быстрее, чем отладка, но почему это профилирование занимает так много времени? Является ли std :: map тайм-хоггером или я делаю что-то крайне неправильное?
РЕДАКТИРОВАТЬ: Обновлен код. Инициирование не требовалось, и теперь в нем хранится длина mLocalName вместо фактической строки.