Aquí hay una curiosidad que he estado investigando. La clase de diccionario .NET se comporta de forma ridículamente rápida en comparación con el mapa desordenado STL en una prueba que sigo ejecutando, y no puedo entender por qué.¿Tabla hash más rápida en C# que en C++?
(0,5 segundos frente a 4 segundos en mi máquina) (.NET 3.5 SP1 frente a Visual Studio STL de 2008 Express SP1)
Por otro lado, si puedo implementar mi propia tabla hash en C# y C++ , la versión de C++ es aproximadamente dos veces más rápida que la de C#, lo cual está bien porque refuerza mi sentido común de que el código máquina nativo es a veces más rápido. (Ver. Dije "a veces".) Siendo la misma persona en ambos idiomas, me pregunto qué trucos fue capaz de jugar el codificador C# de Microsoft que el codificador C++ de Microsoft no. Tengo problemas para imaginar cómo un compilador podría jugar esos trucos por sí mismo, pasando por el problema de optimizar lo que deberían ser llamadas a funciones arbitrarias.
Es una prueba sencilla, almacenamiento y recuperación de enteros.
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 versión de C++ se escribe como un diccionario? –
El código de máquina nativa es más rápido que qué? ¿Cómo crees que se ejecuta C#? –
¿cómo se mide el rendimiento? – stefanB