Je n'ai jamais fait de profilage. Hier, j'ai programmé une classe ProfilingTimer avec un calendrier statique (une carte < std :: string, long long >) pour le stockage de temps.Pourquoi ma classe de profilage est-elle extrêmement lente?
Le constructeur stocke la tique de départ, et le destructor calulates le temps écoulé et ajoute à la carte:
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);
}
Dans toutes les fonctions (ou {bloc}) que je veux le profil que je dois ajouter :
ProfilingTimer _ProfilingTimer("identifier");
Ce profil fonctionne très bien lorsque je compile une version de Visual C++ 2010 Professional. Mais quand je construis comme Debug, je reçois une énorme fps (de 63 à ~ 20).
Ce sont les chiffres que je reçois quand j'imprimer mon emploi du temps (Debug):
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%)
fois Update1 et Update2 la première et la deuxième moitié respectivement de mise à jour. Pourquoi n'atteignent-ils pas 84,1%?
encore ce 84% est un grand nombre - dans la version build je reçois cette sortie:
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% au lieu de 84,1%. C'est une énorme différence!
Quelqu'un sait pourquoi?
EDIT: Je suppose que la version est beaucoup plus rapide que Debug, mais pourquoi ce profilage prend-il du temps? Est-ce que std :: map est l'horreur ou est-ce que je fais quelque chose de très mal?
EDIT: Mise à jour du code. L'initialisation n'était pas nécessaire et stocke maintenant la longueur de mLocalName au lieu de la chaîne actuelle.
Vous pouvez trouver pourquoi tout est lent en le mettant quelques fois en pause: http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024 # 378024 –
Comment puis-je pauler avec VS? – Moberg
C'est un petit bouton avec deux barres verticales (||). Obtenez votre code en cours d'exécution, et pendant qu'il fonctionne, appuyez sur le bouton. Si le temps est trop court pour faire une pause, entourez-le d'une longue boucle. Lorsque vous l'interrompez, examinez la pile d'appels. Cela vous dira exactement ce qui se passe. Si vous le voyez faire la même chose (même si vous définissez «même») deux fois ou plus, vous le faites, vous savez que cela prend beaucoup de temps. Si vous avez> 1 thread, regardez chacun d'eux, mais ignorez celui qui attend la saisie de l'utilisateur. –