Bonjour,
j'ai des problèmes de performance sur une application. Elle avait été développée sous VC++6.0, et elle a été portée sous VS2008.
Après quelques tests, j'arrive à la conclusion que le code produit par VS2008 est bien plus lent que celui produit par VC++6.0 !
Le problème concerne des actions sur une std::map.
J'ai refait un petit programme d'exmple pour bien isoler le problème.
J'ai une classe qui contient un membre de type std::map<>, dans lequel j'insère des attributs. Je commence par faire une recherche pour vérifier si l'attribut existe, j'alloue le nouvel attribut, et je l'insère dans la map.
La classe Attribute ne fait rien, et le programme principal se contente d'instancier un BusinessObj, et d'appeler la methode FillAttributes().
sous VC++6.0, ça me donne les temps suivants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 void BusinessObj::FillAttributes() { AddAttribute( "Attribute1" ); AddAttribute( "Attribute2" ); AddAttribute( "Attribute3" ); AddAttribute( "Attribute4" ); AddAttribute( "Attribute5" ); } void BusinessObj::AddAttribute( char* Attrib_name ) { map < char * , Attribute *,ltstr1>::iterator itor; LARGE_INTEGER liStart; LARGE_INTEGER liFrequency; LARGE_INTEGER liFind; LARGE_INTEGER liAlloc; LARGE_INTEGER liInsert; ::QueryPerformanceFrequency( &liFrequency ); ::QueryPerformanceCounter( &liStart ); itor = Attributes.find((char *) Attrib_name); ::QueryPerformanceCounter( &liFind ); if (itor==Attributes.end()) { Attribute* pNewAttribute = new Attribute(); ::QueryPerformanceCounter( &liAlloc ); Attributes[(char *) strdup(Attrib_name)] = pNewAttribute; ::QueryPerformanceCounter( &liInsert ); } char chBuffer[400]; sprintf(chBuffer, "CBusinessObj::InsertAttribute : Find : %f s -- Alloc : %f s -- Insert : %f s \n", (liFind.QuadPart - liStart.QuadPart) * 1.0 / liFrequency.QuadPart, (liAlloc.QuadPart - liFind.QuadPart) * 1.0 / liFrequency.QuadPart, (liInsert.QuadPart - liAlloc.QuadPart) * 1.0 / liFrequency.QuadPart ); ::OutputDebugString( chBuffer ); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CBusinessObj::InsertAttribute : Find : 0.000002 s -- Alloc : 0.000003 s -- Insert : 0.000016 s CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000003 s -- Insert : 0.000005 s CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000002 s -- Insert : 0.000005 s CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000002 s -- Insert : 0.000004 s CBusinessObj::InsertAttribute : Find : 0.000002 s -- Alloc : 0.000004 s -- Insert : 0.000009 s
et le même projet porté sous VS2008 me donne les temps suivants :
la question est : mais pourquoi ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CBusinessObj::InsertAttribute : Find : 0.000011 s -- Alloc : 0.000005 s -- Insert : 0.000014 s CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000008 s -- Insert : 0.000018 s CBusinessObj::InsertAttribute : Find : 0.000008 s -- Alloc : 0.000007 s -- Insert : 0.000019 s CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000006 s -- Insert : 0.000018 s CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000006 s -- Insert : 0.000019 s
Comment expliquer le facteur 5 pour le find, et le facteur 3 pour l'insert dans la map ??
Comment retrouver des valeurs identiques à celles de VC++6.0 avec VS2008 ?
Partager