Domanda

Il sistema io lavoro qui è stato scritto prima .net 2.0 e non hanno il beneficio di farmaci generici.E ' stato finalmente aggiornato alla versione 2.0, ma nessuno di codice è stato riscritto a causa di vincoli di tempo.Ci sono un certo numero di luoghi in cui il codice utilizza ArraysLists etc.che memorizzare le cose come oggetti.

Dal punto di vista delle prestazioni, quanto sia importante modificare il codice all'utilizzo di farmaci generici?So che da una perfomance prospettiva, boxing e unboxing ecc.... è inefficiente, ma quanto di un guadagno di prestazioni non ci sarà davvero un cambiamento?Sono i generici qualcosa da usare su un andare avanti, o non c'è abbastanza di una performance cambiamento che una coscienza sforzo dovrebbe essere fatto per aggiornare il vecchio codice?

È stato utile?

Soluzione

Tecnicamente la performance dei farmaci generici è, come si dice, meglio.Tuttavia, a meno che le prestazioni è molto importante ED è già stata ottimizzata in altre aree è probabile che per ottenere MOLTO meglio miglioramenti da spendere il vostro tempo altrove.

Vorrei suggerire:

  • utilizzare farmaci generici di andare avanti.
  • se si dispone di solida unità di test, quindi il refactoring di generici si tocca codice
  • trascorrere altro tempo che fa la rifattorizzazione di misura che contribuirà a migliorare notevolmente le prestazioni (chiamate al database, la modifica di strutture di dati, ecc), piuttosto che un paio di millisecondi di qua e di là.

Ovviamente, ci sono altri motivi oltre alla performance di cambiare i farmaci generici:

  • meno soggetto a errori, dal momento che si hanno in fase di compilazione di tipi di
  • più leggibile, non c'è bisogno di gettare in tutto il luogo e ' ovvio che tipo è memorizzato in una collezione
  • se utilizzi generici andando avanti, quindi è veloce da utilizzare ovunque

Altri suggerimenti

Ecco i risultati che ho ottenuto da una semplice analisi di una stringa da un file di 100KB 100.000 volte.Elenco Generico(char) ha preso 612.293 secondi per andare 100.000 volte il file.L'ArrayList prese di 2.880.415 secondi per andare 100.000 volte il file.Questo significa, in questo scenario (come il chilometraggio sarà variare) l'Elenco Generico(char) è di 4,7 volte più veloce.

Qui è il codice che ho svolto 100.000 volte:

Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New ArrayList

    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next

    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next

End Sub

 Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
     Dim genList As New List(Of Char)

     For Each ch As Char In strToProcess.ToCharArray
         genList.Add(ch)
     Next

     Dim dummy As New System.Text.StringBuilder()
     For i As Integer = 0 To genList.Count - 1
         dummy.Append(genList(i))
     Next
 End Sub

L'unico modo per sapere con certezza è quello di analizzare il tuo codice utilizzando uno strumento come dotTrace.

http://www.jetbrains.com/profiler/

È possibile che il boxing/unboxing è banale nella vostra applicazione particolare e non sarebbe degno di refactoring.Andando avanti, si dovrebbe comunque considerare l'utilizzo di farmaci generici a causa del tipo in fase di compilazione di sicurezza.

I farmaci generici, se Java o .NET, dovrebbe essere utilizzato per la progettazione e il tipo di sicurezza, non per le prestazioni.Autoboxing è diverso da generics (essenzialmente implicita di oggetti primitivi conversioni) e, come hai detto, NON si dovrebbe usare al posto di un primitivo, se c'è un sacco di aritmetica o di altre operazioni che causerà un calo di prestazioni ripetuta implicita oggetto di creazione/distruzione.

Nel complesso consiglierei di andare avanti, e solo l'aggiornamento del codice esistente se si ha bisogno di essere ripulito per tipo di sicurezza / di design, non di prestazioni.

Dipende, la risposta migliore è quello di analizzare il tuo codice e vedere.Mi piace AQTime ma un certo numero di pacchetti che esistono per questo.

In generale, se un ArrayList viene utilizzato un SACCO di esso può essere valsa la pena per una versione generica.Davvero, però, è più probabile che ti non sarebbe nemmeno in grado di misurare la differenza di prestazioni.Boxing e unboxing di ulteriori passaggi, ma i computer moderni sono così veloce che non fa quasi nessuna differenza.Come un ArrayList è davvero solo un normale array con un bel wrapper, si sarebbe probabilmente vedere molto di più prestazioni ottenute da una migliore struttura di dati di selezione (ArrayList.Rimuovere è O(n)!) che con la conversione di farmaci generici.

Edit:Fuorilegge Programmatore ha un buon punto, sarà ancora boxing e unboxing con i farmaci generici, succede solo in modo implicito.Tutto il codice di controllo per eccezioni e null dal casting "è/come" parole chiave avrebbe aiutato un po', però.

I maggiori profitti, che potete trovare nelle fasi di Manutenzione.I generici sono più semplici da gestire e aggiornare, senza avere a che fare con la conversione e la colata di problemi.Se questo è il codice che continuate a visitare, quindi con tutti i mezzi prendere lo sforzo.Se questo è il codice che non è stato toccato negli anni, non vorrei davvero fastidio.

Cosa autoboxing/unboxing hanno a che fare con i farmaci generici?Questo è solo un tipo di problema di sicurezza.Con una raccolta non generica, è necessario eseguire il cast torna a un oggetto di tipo effettivo.Con i farmaci generici, è possibile saltare questo passaggio.Io non credo che ci sia una differenza di prestazioni in un modo o l'altro.

La mia vecchia società effettivamente considerato questo problema.L'approccio che abbiamo preso è stata:se è facile per il refactoring, farlo;se non (es.toccherà troppe classi), lasciare per un momento successivo.E ' davvero dipende dal fatto che o non avete il tempo per farlo, o se ci sono i più importanti elementi di codifica (es.caratteristiche che si dovrebbero implementare per i clienti).

Poi di nuovo, se non stai lavorando su qualcosa per un cliente, andare avanti e trascorrere del tempo di refactoring.Potrai migliorare la leggibilità del codice per te.

Dipende da quanto è là fuori nel codice.Se è vincolante o la visualizzazione di elenchi di grandi dimensioni nell'interfaccia utente, si sarebbe probabilmente vedere un grande guadagno in termini di prestazioni.

Se ArrayList sono semplicemente cosparso qua e là, allora probabilmente non sarebbe un grande affare per ottenere solo pulito, ma anche non influiscono sulle prestazioni globali molto.

Se si utilizza un sacco di un ArrayLists tutto il codice, e sarebbe un grande untertaking per sostituire (qualcosa che può avere un impatto vostri programmi), quindi si potrebbe adottare un se-ti-touch-si-cambia-si avvicina.

Cosa principale è, però, che i Generici sono molto più facile da leggere, e sono più stabili attraverso l'app a causa della tipizzazione forte si ottiene da loro.Vedrete guadagni non solo le prestazioni, ma dal codice maintainablity e la stabilità.Se si può fare in fretta, io direi di farlo.

Se è possibile ottenere un buy-in da il Proprietario del Prodotto, ti consigliamo di ottenere ripulito.Amate il vostro codice di più in seguito.

Se l'entità del ArrayLists sono i tipi di Oggetto, è possibile ottenere un po ' da non opporre loro per il tipo corretto.Se sono i tipi di Valore (strutture o primitive come Int32), quindi il boxing/unboxing del processo aggiunge un sacco di overhead, e insiemi Generici dovrebbe essere molto più veloce.

Ecco un articolo di MSDN sul tema

Generics ha prestazioni molto meglio, soprattutto se userai un valore di tipo int, bool, struttura etc.) dove è possibile ottenere un noticeble guadagno di prestazioni.

  1. Utilizzando Arraylist con valore-tipi di cause boxing/unboxing che se fatto centinaia di volte in maniera sostanziale è più lento quindi usando Elenco generico.

  2. quando la conservazione di tipi di valore come oggetto avrai fino a quattro volte di memoria per ogni elemento.Mentre questo importo non diminuisce la RAM la memoria cache che è più piccolo potrebbe contenere meno elementi, il Che significa che, mentre l'iterazione di una lunga collezione ci sarebbero molti di copie dalla memoria principale alla cache che potrebbero rallentare la vostra applicazione.

Ho scritto su qui.

Utilizzando i generics deve anche significare che il codice sarà più semplice e facile da usare se si vuole sfruttare le cose come linq nella successiva c# versioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top