Ho visto spesso questa citazione usata per giustificare ovviamente un codice o codice errato che, sebbene le sue prestazioni non siano state misurate, potrebbe probabilmente essere reso più velocemente abbastanza facilmente, senza aumentare le dimensioni del codice o comprometterne la leggibilità.
In generale, penso che le micro ottimizzazioni iniziali possano essere una cattiva idea. Tuttavia, le macro-ottimizzazioni (cose come la scelta di un algoritmo O (log N) invece di O (N ^ 2)) sono spesso utili e dovrebbero essere fatte in anticipo, poiché potrebbe essere dispendioso scrivere un algoritmo O (N ^ 2) e poi buttalo via completamente a favore di un approccio O (log N).
Nota che le parole potrebbero essere : se l'algoritmo O (N ^ 2) è semplice e facile da scrivere, puoi buttarlo via in seguito senza troppi sensi di colpa se risulta troppo lento. Ma se entrambi gli algoritmi sono allo stesso modo complessi o se il carico di lavoro previsto è così grande che sai già che avrai bisogno di quello più veloce, l'ottimizzazione anticipata è una decisione ingegnosa che ridurrà il carico di lavoro totale nel lungo periodo.
Quindi, in generale, penso che l'approccio giusto sia quello di scoprire quali sono le tue opzioni prima di iniziare a scrivere codice e scegliere consapevolmente l'algoritmo migliore per la tua situazione. Ancora più importante, la frase "l'ottimizzazione prematura è la radice di tutti i mali" non è una scusa per l'ignoranza. Gli sviluppatori di carriera dovrebbero avere un'idea generale di quanto costano le operazioni comuni; dovrebbero sapere, per esempio,
- che le stringhe costano più dei numeri
- che le lingue dinamiche sono molto più lente delle lingue tipicamente statiche
- i vantaggi degli elenchi array / vettori rispetto agli elenchi collegati e viceversa
- quando usare una tabella hash, quando usare una mappa ordinata e quando usare un heap
- che (se funzionano con dispositivi mobili) "double" e "int" hanno prestazioni simili sui desktop (FP potrebbe anche essere più veloce) ma "double" potrebbe essere cento volte più lento su dispositivi mobili di fascia bassa senza FPU;
- che il trasferimento di dati su Internet è più lento dell'accesso all'HDD, gli HDD sono molto più lenti della RAM, la RAM è molto più lenta della cache e dei registri L1 e le operazioni su Internet possono bloccarsi indefinitamente (e fallire in qualsiasi momento).
E gli sviluppatori dovrebbero avere familiarità con una cassetta degli attrezzi di strutture dati e algoritmi in modo da poter utilizzare facilmente gli strumenti giusti per il lavoro.
Avere molta conoscenza e una cassetta degli attrezzi personale ti consente di ottimizzare quasi senza sforzo. Fare un grande sforzo in un'ottimizzazione che potrebbe non essere necessaria è male (e ammetto di cadere in quella trappola più di una volta). Ma quando l'ottimizzazione è semplice come scegliere un set / hashtable invece di un array o memorizzare un elenco di numeri in double [] anziché in string [], allora perché no? Potrei essere in disaccordo con Knuth qui, non ne sono sicuro, ma penso che stesse parlando di ottimizzazione di basso livello mentre sto parlando di ottimizzazione di alto livello.
Ricorda, quella citazione è originaria del 1974. Nel 1974 i computer erano lenti e la potenza di calcolo era costosa, il che ha dato ad alcuni sviluppatori la tendenza a ottimizzare eccessivamente, riga per riga. Penso che sia quello a cui Knuth stava spingendo. Non stava dicendo "non preoccuparti per le prestazioni", perché nel 1974 sarebbe stato un discorso folle. Knuth stava spiegando come ottimizzare; in breve, si dovrebbe concentrarsi solo sui colli di bottiglia e prima di farlo è necessario eseguire misurazioni per trovare i colli di bottiglia.
Si noti che non è possibile trovare i colli di bottiglia fino a quando non si è scritto un programma su misura, il che significa che alcune decisioni sulle prestazioni devono essere prese prima che esista qualcosa da misurare. A volte queste decisioni sono difficili da cambiare se le sbagli. Per questo motivo, è bene avere un'idea generale di ciò che costa in modo da poter prendere decisioni ragionevoli quando non sono disponibili dati concreti.
Quanto precoce da ottimizzare e quanto preoccuparsi delle prestazioni dipendono dal lavoro. Quando scrivi script che eseguirai solo poche volte, preoccuparti delle prestazioni è di solito una completa perdita di tempo. Ma se lavori per Microsoft o Oracle e stai lavorando a una libreria che migliaia di altri sviluppatori useranno in migliaia di modi diversi, potrebbe pagare per ottimizzare l'inferno, in modo da poter coprire tutti i diversi utilizzare i casi in modo efficiente. Tuttavia, la necessità di prestazioni deve essere sempre bilanciata dalla necessità di leggibilità, manutenibilità, eleganza, estensibilità e così via.