2011-04-27 6 views

Respuesta

5

Aquí hay una publicación interesante de François Gaillard sobre FieldByName performance issues.

+0

Me gustaría que hubiera una herramienta de comprobación de estilo de código para el código ineficiente así en el IDE de Delphi (similar a FxCop) ... – mjn

+0

Hay CodeHealer, pero nunca he utilizado: http: //www.socksoftware .com/codehealer.php –

3

El rendimiento no puede ser insignificante, dependiendo de la frecuencia con la que acceda al campo por su nombre. Si lo usa para cada campo y cada fila, puede notar una disminución en el rendimiento (consulte, por ejemplo, http://www.delphifeeds.com/go/s/74559). Para MANTENER legibilidad aún mejorar el rendimiento puede:

  1. Uso del [ 'NombreCampo'] o la sintaxis FieldByName() sólo una vez, y almacenar una referencia al campo en una variable.
  2. Use "static" declaración de campo persistente, haga clic derecho en el conjunto de datos, seleccione Field Editor y agregue los campos necesarios. Declarará el descendiente de TField adecuado y le permitirá asignar un nombre.

También las llamadas a AsXXXXX pueden ser más lentas que utilizando una propiedad de valor nativo del descendiente de TField.

+1

¿Estás seguro de que '.Value' es más rápido que' .As [Type] '? IIRC, '.Value' es una propiedad de tipo variante, mientras que' .As [Type] 'es una propiedad específica de tipo más eficiente. '.Value' es más conveniente. –

+1

BTW: "Término persistente" es el término que está buscando ... ;-) –

+4

La sintaxis ['Fieldname'] no devuelve el campo sino el valor del campo, por lo que no se puede usar para almacenar una referencia al campo . – dummzeuch

1

He encontrado que FieldByName se nota más lento.

Normalmente accedo a la base de datos a través de una capa intermedia, que accede a registros completos desde la misma tabla muchas veces. Al crear esa capa, asigno el índice de cada campo a una variable. Luego uso las variables para un acceso posterior, para tener aún código legible.

ADODataSet.CommandText := 'select * from [TABLE] where 1 = 0'; //table layout 
ADODataSet.Open; 
ADODataSet.GetFieldNames(List); 
varMyField := List.IndexOf('MyField'); 
+2

En este caso, probablemente sea más rápido almacenar una referencia al objeto TField en lugar de su índice. – dummzeuch

Cuestiones relacionadas