Share via


Procedura: migliorare le prestazioni

Aggiornamento: novembre 2007

Le seguenti metodologie di programmazione possono ridurre l'utilizzo della memoria e migliorare le prestazioni delle applicazioni per dispositivi:

Per risparmiare spazio in memoria con Windows Form e grafica

Per risparmiare spazio in memoria con dati e stringhe

  • Utilizzare variabili integer (Int32 oppure Int64) anziché variabili oggetto nei cicli for.

  • Evitare di utilizzare il metodo ToString di un'enumerazione a causa dell'impatto sulle prestazioni conseguente alla ricerca nelle tabelle di metadati.

  • Evitare errori OutOfMemoryException. Questa eccezione può essere generata da Common Language Runtime quando non è possibile allocare memoria sufficiente per scopi interni o per le istanze di nuovi oggetti. Per evitare di generare questa eccezione, non programmare metodi di grandi dimensioni che occupino più di 64 KB di memoria.

  • Rimuovere System.SR.dll, che contiene stringhe di messaggi di errore per le finestre di dialogo relative alle eccezioni. Per risparmiare spazio in memoria, è possibile distribuire l'applicazione senza questo file. .NET Compact Framework carica in modo dinamico le stringhe di errore contenute in System.SR.dll, se il file è presente.

    Se questo file DLL non è presente sul dispositivo, in tutte le eccezioni sarà contenuto un messaggio nel quale è indicato che è impossibile caricare l'assembly della risorsa. Durante lo sviluppo è tuttavia utile aggiungere un riferimento a System.SR.dll nel progetto Visual Studio, in modo che le eccezioni significative vengano visualizzate.

  • Poiché le stringhe non sono modificabili, viene creato un nuovo oggetto String ogni volta che si modifica la stringa. Considerare la possibilità di utilizzare un oggetto StringBuilder quando si costruisce una stringa soggetta a continue modifiche.

  • Se si conosce l'esatto formato utilizzato per la serializzazione di DateTime, per un oggettoDateTime utilizzare il metodo ParseExact. In caso contrario, il parser DateTime tenterà sequenzialmente di applicare più formati specifici delle impostazioni cultura.

  • Limitare il numero di oggetti SqlCeCommand aperti ed eliminarli al termine.

Per risparmiare spazio in memoria durante l'interazione con codice nativo

  • Nelle operazioni di richiamo piattaforma utilizzare tipi copiabili, che dispongono di una rappresentazione comune nella memoria gestita e in quella non gestita, come Int32 o IntPtr. I tipi di valori copiabili maggiori di 32 bit vengono passati più rapidamente per riferimento che per valore. Per ulteriori informazioni sui tipi copiabili, vedere Tipi copiabili di .NET Compact Framework.

  • Per ridurre le operazioni di marshalling non necessarie, utilizzare gli attributi InAttribute e OutAttribute per gli argomenti nella firma di funzione.

  • Per effettuare manualmente la conversione tra IntPtr e oggetti gestiti come PtrToStructure, PtrToStringBSTR, GetObjectForNativeVariant e GetObjectForIUnknown, utilizzare i metodi nella classe Marshal.

  • Per ottenere la compilazione JIT dello stub che supporta le chiamate native a codice gestito, utilizzare i metodi Prelink e PrelinkAll.

  • Se si prevede che l'oggetto COM nativo restituisca generalmente S_FALSE o altri valori non di tipo S_OK HRESULT, impostare il campo PreserveSig su true e fare in modo che la firma gestita corrisponda alla firma nativa. Ciò consente di evitare il sovraccarico di un blocco try/catch necessario quando in fase di esecuzione i valori HRESULT vengono convertiti in eccezioni nelle chiamate COM.

  • Anziché utilizzare più chiamate, effettuare più operazioni possibili in una chiamata richiamo piattaforma.

Per risparmiare spazio in memoria per gli insiemi

  • Se l'insieme si basa su una matrice, utilizzare indicizzatori.

  • Quando possibile specificare le dimensioni dell'insieme, poiché il ridimensionamento dinamico può aumentare notevolmente lo spazio di archiviazione in eccesso.

  • Per evitare il sovraccarico di conversioni boxing e unboxing per tipi valore, utilizzare insiemi generici. La definizione di un insieme ottimizzato personalizzato consente di ottenere le prestazioni migliori.

Per risparmiare spazio in memoria per l'XML

  • Utilizzare XmlTextReader e XmlTextWriter anziché XmlDocument, che utilizza una maggiore quantità di memoria.

  • Per migliorare le prestazioni, specificare impostazioni per XmlReaderSettings e XmlWriterSettings. I valori delle proprietà IgnoreWhitespace e IgnoreComments, se applicabili, possono migliorare notevolmente le prestazioni.

  • Utilizzare le codifiche dei caratteri UTF-8, ASCII e UTF-16, che sono più veloci rispetto alle codifiche per le tabelle codici ANSI e Windows.

  • Evitare di utilizzare uno schema per l'analisi, poiché ciò richiederebbe ulteriore attività di convalida.

  • Quando si popola un oggetto DataSet da un'origine XML, eseguire il mapping delle colonne come attributi e utilizzare un oggetto DataSet tipizzato.

  • Quando si popola un oggetto DataSet evitare quanto segue:

    • Inferenza di schemi.

    • Tabelle nidificate.

    • Numerose colonne DateTime. Per ottenere prestazioni migliori, utilizzare invece il valore della proprietà Ticks.

  • Le indicazioni seguenti consentono di migliorare le prestazioni quando si utilizza la deserializzazione XML:

    • Mantenere i nomi di attributi e di elementi il più possibile brevi poiché ogni carattere deve essere convalidato.

    • Il codice XML basato su dati di attributi è più rapido di quello basato sui dati di elementi.

    • Utilizzare il metodo XmlNodeReader.Skip quando applicabile.

    • Utilizzare la serializzazione binaria quando le prestazioni diventano critiche.

  • Utilizzare un'istanza XmlSerializer per tipo per la serializzazione XML, in modo da ridurre la quantità di tempo necessaria per la ricerca di metadati.

  • Poiché la serializzazione di una quantità elevata di codice XML può esaurire la memoria, si consideri la possibilità di creare in alternativa un meccanismo di serializzazione binaria personalizzato utilizzando oggetti BinaryReader e BinaryWriter.

Per risparmiare spazio in memoria quando si utilizza un servizio Web

  • Quando si legge o si scrive un oggetto DataSet, utilizzare DiffGram. Per ulteriori informazioni, vedere DiffGram (ADO.NET).

  • Salvare un oggetto DataSet remoto e relativo schema sul dispositivo come XML.

  • Durante la visualizzazione della schermata iniziale effettuare una semplice chiamata al metodo del servizio Web, poiché la prima chiamata è più lenta di quelle successive.

  • Gestire con attenzione errori di dati e di rete.

  • In alcuni casi la serializzazione manuale dell'oggetto DataSet come stringa XML prima di effettuare una chiamata al servizio Web consente di migliorare le prestazioni.

Per risparmiare spazio in memoria nella programmazione avanzata

  • Elaborare le operazioni estese in modo asincrono.

  • Evitare chiamate virtuali. Le chiamate virtuali in fase di esecuzione di .NET Compact Framework sono più lente di circa il 30% rispetto alle chiamate di istanza o statiche. .NET Compact Framework non utilizza vtable a causa di vincoli di risorse, di conseguenza è necessario chiamare i metodi con una dispendiosa operazione di attraversamento della gerarchia di interfacce e classi. In .NET Compact Framework viene mantenuta una cache di chiamate virtuali risolte evitando, nella maggior parte dei casi, la reinterpretazione delle chiamate.

  • Utilizzare campi anziché proprietà, se possibile.

  • Quando si definisce un tipo valore. eseguire l'override dei metodi GetHashCode e Equals. In caso contrario, in fase di esecuzione verranno utilizzate versioni generalizzate per questi metodi nella classe di base ValueType.

  • Utilizzare gli oggetti Reflection con cautela. L'utilizzo di oggetti Reflection a scopo di analisi con classi prive di istanze può influire sulle prestazioni degli oggetti con istanze presenti nell'applicazione.

  • Assicurarsi che le risorse gestite dispongano di nomi di tipi completi e che siano corrette nel file RESX. Le versioni devono essere corrette e i campi devono essere di tipo PublicKeyToken. La necessità di individuare il sostituto più appropriato per un tipo non specificato correttamente influisce sulle prestazioni.

  • Si noti che in alcuni casi la lettura di dati dell'applicazione direttamente dal file può essere sufficiente e più efficiente rispetto all'utilizzo di ResourceManager. ResourceManager potrebbe determinare la verifica di più percorsi nel file system per individuare l'assembly satellite con la migliore corrispondenza prima di trovare il file di risorse binario. Utilizzare gli strumenti adatti al processo.

Vedere anche

Concetti

Gestione della memoria del dispositivo in .NET Compact Framework

Procedure relative a .NET Compact Framework

Altre risorse

Prestazioni e diagnostica in .NET Compact Framework