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().

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 );
}
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
 
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 :

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
la question est : mais pourquoi ??
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 ?