Voici une curiosité que j'ai étudiée. La classe .NET Dictionary est ridiculement rapide par rapport à la STL unordered_map dans un test que je continue de faire, et je n'arrive pas à comprendre pourquoi.Hash table plus rapide en C# qu'en C++?
(0,5 secondes contre 4 secondes sur ma machine) (.NET 3.5 SP1 par rapport à Visual Studio de STL de 2008 Express SP1)
D'autre part, si je mets en œuvre ma propre table de hachage en C# et C++ , la version C++ est environ deux fois plus rapide que la version C#, ce qui est bien parce que cela renforce mon bon sens que le code machine natif est parfois plus rapide. (J'ai dit "parfois".) Moi étant la même personne dans les deux langues, je me demande quelles astuces le codeur C# de Microsoft pouvait-il jouer que le codeur C++ de Microsoft n'était pas? J'ai du mal à imaginer comment un compilateur pourrait jouer de telles astuces tout seul, en passant par la difficulté d'optimiser ce qui devrait lui sembler être des appels de fonction arbitraires.
C'est un test simple, le stockage et la récupération des nombres entiers.
C#:
const int total = (1 << 20);
int sum = 0;
Dictionary<int, int> dict = new Dictionary<int, int>();
for(int i = 0; i < total; i++)
{
dict.Add(i, i * 7);
}
for(int j = 0; j < (1 << 3); j++)
{
int i = total;
while(i > 0)
{
i--;
sum += dict[i];
}
}
Console.WriteLine(sum);
C++:
const int total = (1 << 20);
int sum = 0;
std::tr1::unordered_map<int, int> dict;
for(int i = 0; i < total; i++)
{
dict.insert(pair<int, int>(i, i * 7));
}
for(int j = 0; j < (1 << 3); j++)
{
int i = total;
while(i > 0)
{
i--;
std::tr1::unordered_map<int, int>::const_iterator found =
dict.find(i);
sum += found->second;
}
}
cout << sum << endl;
La version C++ est taper comme un dictionnaire est? –
Le code machine natif est plus rapide que quoi? Que pensez-vous que C# fonctionne comme? –
comment mesurez-vous la performance? – stefanB