Cómo: Mejorar el rendimiento

Actualización: noviembre 2007

Las prácticas de programación siguientes pueden ahorrar memoria y aumentar el rendimiento de las aplicaciones para dispositivos.

Para ahorrar memoria con formularios Windows Forms y gráficos

Para ahorrar memoria con datos y cadenas

  • Utilice las variables de tipo entero (Int32 o Int64) en bucles for en vez de las variables de objeto.

  • Evite el uso del método ToString de una enumeración por el impacto que tiene en el rendimiento al buscar por tablas de metadatos.

  • Evite los errores OutOfMemoryException. El Common Language Runtime puede producir esta excepción si no hay suficiente memoria que pueda asignarse para fines internos o para nuevas instancias de objetos. Para evitar esta excepción, evite programar métodos extensos que consuman 64 o más kilobytes de memoria.

  • Quite System.SR.dll, que contiene las cadenas de mensajes de error para los cuadros de diálogo de excepciones. Puede implementar la aplicación sin este archivo para ahorrar memoria. .NET Compact Framework carga dinámicamente las cadenas de error incluidas en System.SR.dll, si este archivo está presente.

    Si el archivo .dll no está presente en el dispositivo, todas las excepciones contienen el mensaje "No se puede cargar el ensamblado de recurso". No obstante, en la fase de desarrollo siempre resulta útil agregar una referencia a System.SR.dll en el proyecto de Visual Studio para poder ver las excepciones más significativas.

  • Las cadenas son inmutables; por tanto, se crea un nuevo objeto String cada vez que modifique la cadena. Considere la posibilidad de usar StringBuilder al construir una cadena que se modificará a menudo.

  • Utilice el método ParseExact para DateTime si conoce el formato exacto utilizado para la serialización DateTime. De lo contrario, el analizador DateTime intentará aplicar secuencialmente varios formatos específicos de la referencia cultural.

  • Limite el número de objetos SqlCeCommand abiertos y elimínelos al finalizar.

Para ahorrar memoria al interoperar con código nativo

  • En operaciones de invocación de plataforma, utilice tipos que puedan representarse en bits o bytes que tienen una representación común en memorias tanto administradas como no administradas, por ejemplo Int32 o IntPtr. Los tipos de valores representables como bits o bytes mayores de 32 bits se pasan más rápidamente por referencia que por valor. Para obtener más información sobre tipos representables como bits o bytes, vea Tipos que pueden representarse como bits o bytes en .NET Compact Framework.

  • Utilice los atributos InAttribute y OutAttribute para los argumentos de la firma de función con el fin de reducir el cálculo innecesario de referencias.

  • Utilice los métodos de la clase Marshal para realizar conversiones manualmente entre IntPtr y objetos administrados, como PtrToStructure, PtrToStringBSTR, GetObjectForNativeVariant y GetObjectForIUnknown.

  • Utilice los métodos Prelink y PrelinkAll para provocar la compilación JIT del código auxiliar que admita llamadas nativas a administradas.

  • Si espera que el objeto COM nativo devuelva S_FALSE como caso habitual u otros valores que no sean S_OK HRESULT, establezca el campo PreserveSig en true y haga que la firma administrada coincida con la nativa. De esta forma, se evita la sobrecarga de un bloque try/catch, que es necesario cuando el motor en tiempo de ejecución traduce los valores HRESULT en excepciones de las llamadas COM.

  • Trabaje todo lo que pueda en una llamada de invocación de plataforma en vez de usar varias llamadas.

Para ahorrar memoria en las colecciones

  • Utilice los indizadores si la colección está basada en una matriz.

  • Siempre que sea posible, especifique el tamaño de la colección, puesto que si se cambia el tamaño dinámicamente, se puede incrementar muchísimo el espacio libre de almacenamiento.

  • Utilice colecciones genéricas para evitar sobrecargas de conversiones boxing y unboxing de los tipos de valores. Si define su propia colección optimizada, obtendrá el máximo rendimiento.

Para ahorrar memoria en XML

  • Utilice XmlTextReader y XmlTextWriter en lugar de XmlDocument, que utiliza más memoria.

  • Especifique la configuración de XmlReaderSettings y XmlWriterSettings para mejorar el rendimiento. Los valores de las propiedades IgnoreWhitespace y IgnoreComments, si se pueden aplicar, pueden mejorar significativamente el rendimiento.

  • Utilice las codificaciones de caracteres de UTF-8, ASCII y UTF-16, que son más rápidas que las de las páginas de códigos ANSI y Windows.

  • Evite utilizar un esquema para analizar, ya que se requiere trabajo de validación adicional.

  • Asigne las columnas como atributos y utilice un objeto DataSet con tipo al rellenar un objeto DataSet desde código fuente XML.

  • Evite lo siguiente al rellenar el formulario DataSet:

    • Interferencia de esquema.

    • Tablas anidadas.

    • Varias columnas DateTime. Para obtener un rendimiento mejor, utilice el valor de la propiedad Ticks en su lugar.

  • Las instrucciones siguientes mejoran el rendimiento al utilizar deserialización XML:

    • Mantenga los nombres de los elementos y atributos lo más cortos posible ya que se debe validar cada carácter.

    • XML basado en datos de atributo es más rápido que XML basado en datos de elemento.

    • Utilice el método XmlNodeReader.Skip cuando se pueda aplicar.

    • Considere la serialización binaria cuando el rendimiento sea algo básico.

  • Utilice una instancia de XmlSerializer por tipo de serialización XML para reducir el período de tiempo transcurrido buscando metadatos.

  • Puesto que serializar grandes cantidades de XML puede consumir toda la memoria, considere la creación de un mecanismo de serialización binaria personalizado en su lugar, mediante BinaryReader y BinaryWriter.

Para ahorrar memoria al utilizar un servicio Web

  • Utilice un DiffGram al leer y escribir un DataSet. Para obtener más información, vea DiffGrams (ADO.NET).

  • Guarde un DataSet remoto y su esquema en el dispositivo como XML.

  • Efectúe una llamada simple al método del servicio Web mientras aparece la pantalla de inicio porque la primera llamada es más lenta que las posteriores.

  • Tenga cuidado al controlar los errores de red y datos.

  • En algunos casos, se puede obtener un rendimiento mejor si se serializa manualmente DataSet como cadena XML antes de realizar una llamada a un servicio Web.

Para ahorrar memoria en programación avanzada

  • Procese las operaciones grandes de forma asincrónica.

  • Evite llamadas virtuales. Las llamadas virtuales del motor en tiempo de ejecución de .NET Compact Framework son aproximadamente un 30 por ciento más lentas que las llamadas estáticas o a instancias. .NET Compact Framework no utiliza vtables porque los recursos son limitados; por tanto, se debe llamar a los métodos recorriendo la jerarquía de clases e interfaces, aunque esta operación es costosa. .NET Compact Framework mantiene una caché de llamadas virtuales resueltas; por consiguiente, en la mayoría de los casos, las llamadas no necesitan reinterpretarse.

  • Utilice campos en lugar de propiedades siempre que sea posible.

  • Reemplace los métodos GetHashCode y Equals al definir un tipo de valor. Si no se reemplazan, el motor en tiempo de ejecución utiliza las versiones generalizadas de estos métodos en la clase base ValueType.

  • Utilice la reflexión con precaución. El uso de la reflexión con clases sin instancias, con fines de investigación, puede repercutir en el rendimiento de los objetos con instancias de la aplicación.

  • Asegúrese de que los recursos administrados tienen los nombres de tipo completos y son correctos en el archivo RESX. Deben tener la versión y los campos PublicKeyToken correctos. El esfuerzo por encontrar al suplente más adecuado para un tipo especificado incorrectamente se refleja en el rendimiento.

  • Tenga en cuenta que, en algunos casos, si se leen los datos de la aplicación del archivo directamente, puede ser suficiente y más eficaz que utilizar ResourceManager. ResourceManager puede comprobar varias ubicaciones del sistema de archivos para encontrar un ensamblado satélite que coincida mejor antes de ubicar el binario de recursos. Utilice las herramientas adecuadas para el trabajo.

Vea también

Conceptos

Administración de memoria de dispositivos en .NET Compact Framework

.Temas "Cómo..." de .NET Compact Framework

Otros recursos

Rendimiento y diagnósticos de .NET Compact Framework