È un flusso di lavoro inefficiente scrivere codice e POI tornare indietro e ottimizzare?

4

Sono un nuovo programmatore appassionato. Ho fatto piccoli e grandi progetti avanti e indietro negli ultimi due o tre anni.

Colpisco sempre piccoli intoppi nel mio codice che si sommano a grossi maiali di memoria o linee inutili di codice lungo la strada. La mia filosofia sui grandi progetti è sempre stata quella di "togliermi dalla testa" e scrivere tutto il codice in un prodotto funzionante, quindi tornare indietro e ridurre il codice a una forma più semplice e ottimizzata. Tuttavia, questo non sempre funziona: quando faccio le strutture del database, tendo a dover tornare indietro molte volte per aggiungere funzionalità che emergono al momento. Interi blocchi di codice devono essere cancellati a causa di un'idea spontanea.

La mia domanda è, è più efficiente scrivere un intero programma e POI tornare indietro e ottimizzarlo, oppure dovrei ottimizzare il codice mentre lo scrivo?

    
posta esqew 14.09.2011 - 06:00
fonte

6 risposte

10

L'ottimizzazione prematura è la radice di tutti i mali.

Quella citazione viene sfruttata eccessivamente e applicata oltre il contesto previsto originariamente, ma il punto generale si applica certamente qui: non smettere di ottimizzare finché non sei sicuro di doverlo ottimizzare, e non sarai sicuro fino a dopo Ho scritto la maggior parte del programma.

    
risposta data 14.09.2011 - 06:33
fonte
9

is it more efficient to write an entire program and THEN go back and optimize it, or should I optimize code as I write it

Nessuno dei due.

Ti manca un intero componente enorme per SDLC: design .

Dovresti provare i concetti che non conosci con l'ambiente sandbox (il che significa che in realtà non si collega al resto del tuo progetto, o se lo fa, è facile sostituirlo con qualcosa con un po ' più pensiero dietro di esso).

Prendi gli insegnamenti dal tuo prototipo e scrivi un disegno tecnico. A questo punto dovresti aver provato tutte le incognite e aver individuato potenziali piccoli trucchi tecnici. L'intento qui è quello di svuotare completamente il tuo progetto e renderlo ottimale al bisogno (refactoring per l'ottimizzazione mentre la codifica è una cattiva pratica).

Quindi implementa il tuo design. Potrebbero esserci delle piccole sviste che potresti dover rendere conto, ma quando inizi a scrivere il codice che si farà strada nel tuo progetto principale, avrai dimostrato il tuo concetto (tramite la prototipazione) così come un design efficiente che tiene conto di tutti i casi limite di cui tu e i tuoi colleghi potete pensare (progettazione tecnica).

    
risposta data 14.09.2011 - 07:39
fonte
5

Ti farò una controproposta. Supponiamo che dovresti prima delineare le tue classi, che si tratti di qualcosa come i mock UML o semplicemente dei contorni di classe che non conta, quindi, una volta determinato ciò che sembra essere l'approccio migliore, inizia a scrivere. Una volta terminata una parte evidente del progetto, è opportuno tornare indietro e pulire il cruft.

A seconda della scala del progetto e dello sviluppatore, questo potrebbe essere un insieme di classi, una classe individuale o persino (raramente) un metodo. Ma non è quasi mai una buona idea aspettare fino a quando non viene fatto tutto per ottimizzare. OTOH, è altrettanto sbagliato ottimizzare troppo presto. Questo lascia come unica opzione un processo di scrittura e quindi di pulizia, scrittura e pulizia.

    
risposta data 14.09.2011 - 06:17
fonte
2

Non ottimizzare affatto finché il programma in esecuzione non ti dice cosa è necessario ottimizzare .

Ecco cosa intendo.

Se ottimizziamo senza sapere quali ottimizzare , siamo un po 'come ubriaco alla ricerca delle sue chiavi .

    
risposta data 14.09.2011 - 14:19
fonte
1

Nel tuo caso, sembra che il momento migliore per "ottimizzare" dipenda da cosa stai facendo.

Se il tuo codice è molto modulare, giocarci più tardi potrebbe non essere molto fastidioso, quindi potrebbe essere meglio "ottimizzare" in seguito. Se dipendi molto dallo schema del tuo database, in seguito potrebbe essere fastidioso con lo schema del tuo database, quindi potrebbe essere meglio "ottimizzare" prima.

("Ottimizza" è tra virgolette perché non sono così sicuro di cosa intendi per "ottimizzare".)

    
risposta data 14.09.2011 - 07:08
fonte
1

Per me è spesso più produttivo sbagliare dal lato dell'ottimizzazione con il senno di poi, semplicemente schiaffo in un'implementazione di base che è facile da ragionare in termini di correttezza e rivisitazione secondo necessità con il profiler in mano. Preferisco scorrere a soluzioni più rapide quando possibile / pratico perché mi piace vedere il mio sistema sbrigarsi prima anche se devo tornare indietro e approfondire e sintonizzarlo in aree chiave.

Ma ho bisogno di mettere molta enfasi sulla parte pratica , poiché non è che tu possa scrivere un software il cui design ruota attorno all'interazione con oggetti teeny in uno scalare, uno alla volta moda, e si aspettano di trovare molto spazio per ottimizzarlo senza modificare il design. Non c'è bisogno di avere un'auto da corsa se ci sono solo 10 metri di strada da percorrere, e progettare interfacce eccessivamente granulari che trattano di cose piccanti, una volta alla volta, ti possono ingannare con un design che non lascia respiro spazio per l'ottimizzazione.

Quindi aiuta quando si anticipa un'area critica dal punto di vista delle prestazioni, che credo si possa anticipare spesso senza misurare *, per progettare interfacce sufficientemente grossolane, non granulari.

  • As said I believe you can anticipate where the performance-critical parts are in your system reasonably well, even if you may not be able to anticipate the details fully until measuring. All you have to do is ask basic questions like, "where are we going to be looping over a million things"? Well, if you are implementing a GUI system, it's obvious where you'll be looping over a million things, and that'll be in the GUI drawing functions where you can potentially be looping over a million pixels to process. It's not unreasonable to deduce, in foresight, that this area is probably going to be a performance-critical so that you design it with sufficient breathing room to optimize and optimize it in the future.

Ad esempio, invece di far ruotare il tuo sistema sull'interazione con oggetti Pixel granulari, disegnalo per interagire con collezioni di Pixels con Image oggetti che potrebbero rappresentare milioni di pixel contemporaneamente. Analogamente anziché Particle oggetti, interagisci con ParticleSystem . Invece di Creature , interagisci con Creatures . Invece di un callback che è progettato per elaborare una cosa teeny alla volta (un pixel alla volta, ad es.), Avere un callback che è progettato per elaborare una serie di cose alla volta (un intervallo di pixel alla volta). Questi tipi di cose ti lasceranno molto più respiro per ottimizzare senza modificare il design.

Librerie generiche

Detto questo, questo consiglio è rivolto a persone come te che vogliono andare avanti e affrontare grandi progetti. Se, per esempio, siete nella mentalità di progettare una biblioteca di strutture dati di uso generico le cui intenzioni devono essere quanto più largamente applicabili possibile, ed è fondamentalmente il prodotto finale, allora potreste risparmiare più tempo a pensare a come realizzarlo il più efficiente possibile in anticipo - ovviamente ancora misurando, sintonizzando e iterando mentre procedete, ma non semplicemente schiacciando un'implementazione di base se siete abbastanza sicuri che dovrete riscriverlo.

In questi casi, l'efficienza e l'applicabilità sono concetti correlati, dal momento che se la tua libreria è distorta in termini di prestazioni e manca di strutture dati a tutto tondo, le persone potrebbero non usarli così tanto o si potrebbe finire per sentire l'introduzione di sempre più dati le strutture durante la sintonizzazione delle precedenti potrebbero essere sufficienti. Quindi a volte può davvero pagare solo per cercare di ottenere la versione più efficiente che è possibile in anticipo. Nel corso degli anni ho scoperto che mi sono migliorato nell'ottimizzare il codice e in particolare per la località di riferimento che posso utilizzare usando sempre meno strutture di dati, finendo con strutture dati più complete che posso utilizzare in un contesto più ampio gamma di aree invece di quelle con caratteristiche di prestazione distorta che sono strettamente applicabili. Il risultato finale è molto meno codice per mantenere e migliorare la produttività, anche se è il risultato di una mentalità di ottimizzazione.

    
risposta data 17.12.2017 - 07:03
fonte

Leggi altre domande sui tag