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
Utilice los métodos BeginUpdate y EndUpdate en los controles que los proporcionen, como ComboBox, ListBox, ListView, ToolStripComboBox y TreeView.
Utilice los métodos SuspendLayout y ResumeLayout al cambiar la posición de los controles.
Cargue formularios adicionales en segundo plano y rellene los controles con datos antes de utilizar el método Show().
Limite el código de control de eventos para realizar sólo las tareas básicas. De esta forma pueden proseguir los procesos pendientes.
Antes de eliminar un objeto suscriptor, cancele la suscripción a sus eventos utilizando el operador de asignación y resta (-=). Para obtener más información, vea Cómo: Suscribir y cancelar la suscripción a eventos (Guía de programación de C#). Los problemas derivados de los errores que se producen al cancelar la suscripción son similares a una pérdida de memoria.
Utilice un mapa de bits fuera de la pantalla. Para obtener un ejemplo, vea Cómo: Dibujar imágenes fuera de la pantalla.
Reemplace los métodos OnKeyDown, OnKeyPress y OnKeyUp en los controles en vez de agregar los controladores de eventos clave.
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:
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