Escribo un objetivo haXe C#, y he estado estudiando las diferencias de rendimiento para la biblioteca estándar de haXe, de modo que podamos ofrecer el mejor rendimiento posible a través de su código multiplataforma.System.Collections.Generic.Dictionary = ¿Rendimiento máximo?
Un muy buen ejemplo es para el código de la tabla hash. Estaba un poco reacio a usar .NET's Dictionary, ya que parece voluminoso (las estructuras para los pares clave/valor pueden ocupar una gran cantidad de memoria debido a problemas de alineación de la memoria, además de la información innecesaria que contiene), y desde el estándar En la biblioteca no existe el hash de objetos, realmente pensé que podría exprimir un poco el rendimiento al no tener que llamar a GetHashCode, y alinearlo todo el tiempo.
También está claro que la implementación del diccionario utiliza una lista vinculada para hacer frente a las colisiones, lo que está lejos de ser ideal.
Así que comenzamos a implementar nuestra propia solución, comenzando con IntHash (Dictionary) Implementamos por primera vez Hopscotch hashing, pero realmente no salió muy bien, pero era obvio que no admitiría muy bien enormes tablas hash, ya que H es normalmente una palabra de máquina, y como H/Length aumenta, peor es el rendimiento.
Luego saltamos para implementar un algoritmo inspirado khash. Este tenía mucho potencial, ya que sus puntos de referencia son impresionantes y maneja las colisiones en la misma matriz. También tenía algunas cosas buenas, como cambiar el tamaño sin necesitar el doble de memoria que lo haríamos.
Los puntos de referencia fueron decepcionantes. Por supuesto, no hay necesidad de decir que el uso de memoria fue mucho menor en nuestra implementación que Dictionary. Pero también esperaba obtener un buen impulso en el rendimiento, pero ese no fue el caso, desafortunadamente. No estaba demasiado lejos, menos de un orden de magnitud, pero tanto para los conjuntos como para los get, la implementación de .NET aún funcionaba mejor.
Entonces mi pregunta es: ¿es eso lo mejor que tenemos para C#? Traté de buscar cualquier solución personalizada, y parece que no hay casi ninguna. Existe esa colección genérica de C5, pero el código está tan desordenado que ni siquiera probé. Y tampoco encontré un punto de referencia.
Entonces ... ¿Es eso? ¿Debo simplemente envolver el diccionario <>?
Gracias !!!
El diccionario no almacena KeyValuePairs. – SLaks
He hecho la experiencia de que las reimplementaciones manuales de las colecciones .NET * no pueden * competir con las implementaciones incluidas. No sé por qué ocurre esto, pero sospecho que CLR/JIT "engaña" al optimizar el código, ya que tiene un conocimiento previo de los contenedores .NET. –
Konrad: ¡esa fue en realidad mi respuesta favorita! :) – Waneck