2009-02-12 7 views
7

Quando detto questo codice ha bisogno di qualche ottimizzazione, o può essere un po 'come ottimizzato, che cosa significa? quale tipo di codice ha bisogno di ottimizzazione? Come applicare l'ottimizzazione al codice in C#? Quali sono i vantaggi?Che cos'è l'ottimizzazione del codice?

risposta

15

Ottimizzazione è un termine molto ampio. In generale implica la modifica del sistema per rendere alcuni dei suoi aspetti più efficienti o utilizzare meno risorse o essere più robusti. Ad esempio, un programma per computer può essere ottimizzato in modo che possa essere eseguito più rapidamente o utilizzare meno memoria o memoria su disco o essere più reattivo in termini di interfaccia utente.

Sebbene "ottimizzazione" abbia la stessa radice di "ottimale", il processo di ottimizzazione non produce un sistema totalmente ottimale: c'è sempre un compromesso, quindi vengono ottimizzati solo gli attributi di maggior interesse.

E ricordate:

la prima regola di programma di ottimizzazione: Non farlo. La seconda regola di ottimizzazione del programma (solo per esperti!): Non farlo ancora. (Michael A. Jackson)

+3

+1, ma odio quella citazione di Jackson. Fondamentalmente sta dicendo di aver progettato un sistema performante e, in caso contrario, rinviare le correzioni necessarie fino all'ultimo momento possibile. IMO, una ricetta per il disastro. Direi semplicemente di capire le tue esigenze di perforanza e di sviluppare di conseguenza. –

+1

Preferisco la citazione di Donald Knuth, "Dovremmo dimenticare le piccole efficienze, diciamo circa il 97% delle volte: l'ottimizzazione prematura è la radice di tutto il male, ma non dovremmo perdere le nostre opportunità in quel 3% critico." Quel 3% critico è una parte particolarmente importante (e spesso ignorata) di questa citazione. È il frutto basso in sospensione. A volte i maggiori profitti possono essere realizzati con il minimo sforzo. Devi solo passare un po 'di tempo a misurare e analizzare per trovare quei colli di bottiglia. –

-3

Potrebbe essere ad esempio che il codice ha un blocco di codice che è duplicato e potrebbe/dovrebbe essere inserito in un metodo, potresti usare metodi/classi deprecati, potrebbero esserci modi più semplici per fare ciò che il codice sta facendo, ci potrebbe essere un po 'di pulizia da fare (ad esempio rimuovere hard coding) ecc ...

+0

Penso che si chiami refactoring. Non è esattamente la stessa cosa. –

3

L'ottimizzazione del codice sta rendendo il codice più veloce. Ci sono due modi principali per farlo:

1) Spremitura più lavoro in meno cicli. Scopri dove il codice sta facendo una copia extra o se c'è un ramo in un circuito chiuso. Questo sta ottimizzando nel piccolo.

2) Effettuare l'algoritmi di scala migliore. Potresti aver sentito parlare della notazione "Big O". Questo sta facendo degradare un algoritmo molto meno velocemente con grandi serie di dati.

Ad esempio, se si cerca ingenuamente una rubrica telefonica per un nome si inizierà a pagina 1 e leggere tutti i nomi fino a trovare quello che state cercando. Questo richiederà un numero di istruzioni ridimensionato in base al numero di nomi nella rubrica. Chiamiamo questo O (n). Ora pensa a come cerchi davvero la rubrica. Apri un punto verso il centro e vedi da che parte sta il nome che stai cercando. Questa è chiamata ricerca binaria e scala nel logaritmo del numero di nomi. Chiamiamo questo O (logn). È molto più veloce.

ricordare la prima regola di ottimizzazione: Misura prima. Sono stati spesi molti anni per ottimizzare il codice che non è stato eseguito molto.

+0

Allargerei "corre più veloce" a "consuma meno risorse". – peterchen

+0

Questo è utile ma sarebbe più utile una spiegazione Dalla rubrica, supponiamo che io abbia migliaia di nomi e ogni nome abbiano uno o più telefoni, nella ricerca di ogni nome con tutti i suoi telefoni, deve eseguire il ciclo per ogni nome e selezionarlo. Dove ottimizzare qui. Come applicare Big O. –

+0

Tendo ad essere d'accordo con Peter Chen che la risorsa principale che si esaurisce in questi giorni non è il ciclo della CPU. IMO è la larghezza di banda della rete, quindi tutti gli sforzi per ottimizzare i codec AV ... –

5

Optimization è il processo di modifica di un sistema per far funzionare un aspetto in modo più efficiente o utilizzare meno risorse.

Nel tuo caso si riferisce principalmente a 2 livelli:

livello di progettazione

Al livello più alto, il design può essere ottimizzato per sfruttare al meglio le risorse disponibili. L'implementazione di questo progetto trarrà vantaggio da una buona scelta di algoritmi efficienti e l'implementazione di questi algoritmi trarrà vantaggio dalla scrittura di codice di buona qualità. Il design architettonico di un sistema influenza in modo schiacciante le sue prestazioni.La scelta dell'algoritmo influisce sull'efficienza più di ogni altro elemento del design. In alcuni casi, tuttavia, l'ottimizzazione si basa sull'uso di algoritmi amatoriali, facendo uso di casi speciali e trucchi speciali e eseguendo complessi compromessi; quindi, un programma completamente ottimizzato può a volte, se non sufficientemente commentato, essere più difficile da comprendere per i programmatori meno esperti e quindi può contenere più errori rispetto alle versioni non ottimizzate.

livello di codice sorgente

Evitare di codifica di cattiva qualità può anche migliorare le prestazioni, evitando rallentamenti evidenti. Successivamente, tuttavia, sono possibili alcune ottimizzazioni che riducono effettivamente la manutenibilità; alcuni, ma non tutti possono essere eseguiti oggigiorno ottimizzando i compilatori. Ad esempio, spesso è necessario utilizzare un numero maggiore di riferimenti indiretti per semplificare o migliorare un software, ma tale riferimento indiretto ha un costo.

1

Per aggiungere alla risposta di Anton Gogolev, quando un pezzo di codice ha bisogno di ottimizzazione, è perché non viene soddisfatta una particolare richiesta di prestazioni. Sviluppiamo programmi per soddisfare le esigenze degli utenti, giusto? La maggior parte dei programmatori tende a pensare in gran parte in termini di requisiti funzionali, cioè cosa fa il programma, ma gli utenti avranno anche requisiti prestazionali, qual è il costo della risorsa (larghezza di banda della rete, cicli della CPU, memoria, spazio su disco, ecc ...) di fornire la funzionalità. L'ottimizzazione è il processo di modifica di una parte di codice per soddisfare un requisito di prestazioni specifico. IMHO questo dovrebbe accadere in fase di progettazione, ma a volte si scriverà un pezzo di codice solo per scoprirne prestazioni inferiori. Per ottimizzare il codice, devi prima scoprire qual è la risorsa che stai utilizzando. Se si tratta di cicli o memoria della CPU, un profiler potrebbe essere d'aiuto. Se è la larghezza di banda della rete, che è molto comune in questi giorni, è necessario eseguire alcuni test di carico e profiling di comunicazioni.

Il mio consiglio sarebbe quello di comprendere sempre i requisiti di prestazione futuri attuali e probabili prima di scrivere il codice e ottimizzare in fase di progettazione. L'ottimizzazione tardiva è costosa, difficile e spesso fallisce o risulta in un brutto codice.

1

Optimization ha due scopi principali:

  • ottenere l'utilizzo del software di meno risorse, ad esempio, correre più veloce, più piccolo, utilizzare meno RAM, meno spazio su disco rigido, sia durante l'esecuzione e quando la memorizzazione dei documenti, meno della rete accesso, ...

  • rendere il software più manutenibile, refactoring.

Non è necessario per ottimizzare il tempo che nessun problema correlato è stato sollevato: E 'molto più difficile da eseguire il debug di codice ottimizzato piuttosto che ottimizzare codice corretto.

3

Quando si esegue l'ottimizzazione del codice, si prende una metrica sul codice e si tenta di renderlo più efficiente. La metrica di solito si riferisce a una risorsa scarsa.

Ecco metriche comuni

  • velocità di esecuzione (di solito il primo che viene in mente quando dice ottimizzazione)
  • Il consumo di memoria
  • formato eseguibile (su sistemi embedded può essere importante)
  • Accesso al database
  • Accesso al servizio remoto (Riduzione dello chatty, memorizzazione nella cache ..)
  • Semplicità, leggibilità, manutenibilità del codice

Dopo l'ottimizzazione del codice dovrebbe dare lo stesso risultato.

Il problema è che devi fare delle scelte. La velocità di esecuzione spesso si traduce in un maggior consumo di memoria ...

Si dovrebbe anche considerare l'ottimizzazione a livello globale. Avere un guadagno di 10 ms in un ciclo quando si spendono 1000 ms in attesa di un servizio Web è completamente inutile.

Problemi correlati