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