¿Es la consulta de KeyValue Pairs eficiente en comparación con los objetos de dos propiedades?

7

Estoy trabajando en un servicio web y estoy devolviendo JSON. Sin embargo, estoy devolviendo un List<KeyValuePair<string, int>> , ya que eso es todo lo que realmente voy a tratar (propiedad = > valor)

Ahora, algunas veces yo mismo llamaré a estas funciones para agregar los resultados, así que termino con algo como

List<KeyValuePair<string, int>> myList = resultList.where(o => o.Key =="StringKEY");

y algunas veces

List<KeyValuePair<string, int>> myList = resultList.sum(o => o.Key =="StringKEY");

Mi pregunta es si sería más eficiente hacer lo siguiente (clase personalizada vs diccionario):

List<MyObject> myObj = resultObjList.where(o => o.Property1 == "stringProperty")

y así sucesivamente.

¿Hay algún beneficio al usar objetos personalizados? Nunca necesitaré agregar propiedades, y en este caso puedo decir que nunca habrá necesidad de propiedades adicionales.

    
pregunta hanzolo 24.01.2012 - 19:28

3 respuestas

7

¿Estás preguntando cuál es la diferencia entre un KeyValuePair y un objeto de dos propiedades? No hay ninguno, KeyValuePair es un objeto de dos propiedades. En realidad, podría haber una diferencia: KeyValuePair es un tipo de valor y su objeto personalizado probablemente será un tipo de referencia. La diferencia entre un tipo de referencia y un tipo de valor puede tener un impacto en el rendimiento (especialmente en algunos entornos específicos, como XNA en XBox). Pero si esta diferencia es importante para usted, siempre puede convertir su tipo personalizado en un tipo de valor.

Por lo tanto, mi consejo es usar KeyValuePair para las cosas que realmente son una clave y un valor. Si la relación entre los dos valores es diferente, debe crear su tipo personalizado, por motivos de legibilidad.

Otra opción en C # 7.0 y más reciente es usar tuplas. Son tipos de valor, como KeyValuePar , pero usarlos no implica que tenga una clave y un valor.

    
respondido por el svick 24.01.2012 - 20:50
3

Definir perfiles siempre que tengas dudas es definitivamente una buena forma de proceder. Ya que no puedo perfilar su código (ni es probable que quiera hacerlo), compartiré mis dos centavos de teoría:

Tanto el objeto de dos propiedades como su KeyValuePair esencialmente almacenan exactamente los mismos datos y en ambos casos usted almacena sus datos en una colección de la Lista, lo que significa que para encontrar entradas individuales, debe realizar un análisis de la colección completa, (n) operación.

Teóricamente, KeyValuePair < > podría ser un poco más rápido (no estoy seguro si incluso el generador de perfiles lo notaría) porque hay un nivel menos de direccionamiento indirecto que tiene que tener lugar.

  • ListEntry (KeyValuePair) - > cuerda; ListEntry (KeyValuePair)
  • ListEntry (obj ref) - > Objeto - > cuerda; ListEntry (obj ref) - > Objeto (int)

Sin embargo, un cambio que podría hacer para mejorar el rendimiento si su colección es bastante grande, es usar un tipo diferente en lugar de una Lista. Con List, te quedas atascado en búsquedas lineales y realmente no puedes alejarte de eso (a menos que gastes un esfuerzo extra en la clasificación manual, pero ¿por qué)?

Ya que tiene la idea de que cada objeto tiene una clave, use Diccionario < > o SortedDictionary < > el cual estaría tecleado de tu llave.

En este caso, solo para ofrecerle una comparación, si su Lista tiene 1000 entradas y necesita encontrar una, en el peor de los casos tendrá que hacer 1000 comparaciones. Si usa una colección con clave, en el peor de los casos, solo realizará 10 comparaciones. Al realizar una suma o buscar varios elementos con la misma clave, todos se ubicarán juntos en la colección, por lo que también será mucho más fácil (computacional) realizar esa operación, en lugar de buscarlos en todas partes.

    
respondido por el DXM 25.01.2012 - 04:25
0

Creo que le será difícil encontrar una diferencia de rendimiento en el mundo real, dado que este es un servicio web. La solicitud HTTP más rápida seguirá siendo órdenes de magnitud más lentas que cualquier tipo de microoptimización que pueda obtener aquí.

Desde el punto de vista del código, a menos que esté tratando con una lista arbitraria de claves, correría con un buen POCO. La comprobación de tipo Intellisense y compilación es genial.

    
respondido por el Wyatt Barnett 25.01.2012 - 15:50

Lea otras preguntas en las etiquetas