Pregunta

quandry es - ¿cuál de los dos métodos siguientes se comporta mejor
Meta - obtener un objeto de tipo Paquete de oferta (se define a continuación)
Criterios - velocidad sobre el almacenamiento
No. de registros - 1000- sobre alrededor de 2000, como máximo sobre 6K
Opciones - Crear objeto sobre la marcha o hacer una búsqueda de un diccionario
Velocidad de ejecución - llamado x veces por segundo

NB - i necesidad de entregar el código de trabajo primero y luego ir para la optimización, por lo tanto, si alguna teóricos pueden proporcionar atisbos detrás de la información de escena, que va a ayudar antes de llegar a la prueba de rendimiento real, posiblemente por EOD jue

Definiciones -

class Wrapper  
{  
   public readonly DataRow Row;  
   public Wrapper(DataRow dr)  
   {  
      Row = dr;  
   }  
   public string ID { get { return Row["id"].ToString(); } }  
   public string ID2 { get { return Row["id2"].ToString(); } }  
   public string ID3 { get { return Row["id3"].ToString(); } }  
   public double Dbl1 { get { return (double)Row["dbl1"]; } }  
   // ... total about 12 such fields !  
}  
Dictionary<string,Wrapper> dictWrappers;  

Método 1

Wrapper o = new Wrapper(dr);  
/// some action with o
myMethod( o );

Método 2

Wrapper o;    
if ( ! dictWrappers.TryGetValue( dr["id"].ToString(), out o ) )    
{    
    o = new Wrapper(dr);    
    dictWrapper.Add(o.ID, o);    
}    

/// some action with o    
myMethod( o );    
¿Fue útil?

Solución

La primera de ellas sería más rápido, ya que no está realmente haciendo una búsqueda, que sólo está haciendo una asignación simple y una asignación.

Los dos segmentos de código no son casi equivalentes. En función sin embargo, debido Método 1 podría crear muchos duplicados.

Otros consejos

  1. Nunca optimizar sin perfilar primero.
  2. Nunca perfil a menos que el código no cumple con las especificaciones / expectativas.
  3. Si usted necesita para perfilar este código, escribirlo en ambos sentidos y de referencia con su carga esperada.

EDIT: Trato de favorecer la optimización siguiente sobre el rendimiento es inaceptable a menos que:

  • Sencillez
  • Legibilidad
  • mantenibilidad
  • Testabilidad

He (recientemente) visto código altamente optimizado que era muy difícil de depurar. Me refactorizado que para simplificar, entonces encontré pruebas de rendimiento. El rendimiento era inaceptable, por lo que perfila ella, encontraron los cuellos de botella, y sólo aquellos optimizado. Me re-encontré con las pruebas de rendimiento, y el nuevo código era comparable a la versión altamente optimizada. Y es ahora mucho más fácil de mantener.

Sin llegar a probar que se puede esperar que el almacenamiento en caché los valores de los campos en la envoltura (es decir, evitando todas las llamadas ToString y yesos) probablemente tendría un mayor impacto en el rendimiento.

A continuación, una vez que haya almacenamiento en caché esos valores es probable que desee mantener las instancias de la envoltura alrededor en lugar de volver a crearlos con frecuencia.

Si se asume que eres realmente preocupado por (ojo, que ocurre), entonces su propia envoltura subyacente podría mejorarse. Lo estás haciendo búsquedas de campo por la cadena. Si usted va a hacer la llamada mucho con el mismo conjunto de campos en la fila, en realidad es más rápido para almacenar en caché los ordinales y mirar hacia arriba por ordinal.

Por supuesto, esto es sólo si realmente, realmente tiene que preocuparse por el rendimiento, y los casos en que esto haría una diferencia son bastante raros (aunque en dispositivos embebidos que no es tan raro como en el escritorio).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top