Ecco una curiosità che ho indagato. La classe .NET Dictionary è incredibilmente veloce rispetto alla STL unordered_map in un test continuo a funzionare e non riesco a capire perché.Tabella hash più veloce in C# rispetto al C++?
(0,5 secondi contro 4 secondi sulla mia macchina) (.NET 3.5 SP1 vs. Visual Studio STL del 2008 Express SP1)
D'altra parte, se implementare la mia tabella hash in C# e C++ , la versione C++ è circa due volte più veloce di quella C#, il che va bene perché rinforza il mio senso comune che il codice macchina nativo sia a volte più veloce. (Vedi. Ho detto "a volte".) Essendo io la stessa persona in entrambe le lingue, mi chiedo quali trucchi sia stato il programmatore C# di Microsoft in grado di riprodurre che il codificatore C++ di Microsoft non lo era? Ho difficoltà a immaginare come un compilatore possa eseguire tali trucchi da solo, passando attraverso il problema di ottimizzare ciò che dovrebbe sembrare essere chiamate di funzione arbitrarie.
È un semplice test, memorizza e recupera numeri interi.
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 versione C++ digitata come un dizionario è? –
Il codice macchina nativo è più veloce di cosa? Come pensi che C# vada come? –
come si misura la prestazione? – stefanB