Cosa ottimizzi per? [chiuso]


19

In generale, a quale tipo di ottimizzazione tendi di solito a progettare il software?

Sei il tipo che preferisce ottimizzare il tuo design per

  • Tempo di sviluppo (ovvero veloce da scrivere e / o più facile da mantenere)?
  • Tempo di elaborazione
  • Spazio di archiviazione (RAM, DB, Disc, ecc.)

Naturalmente questo è altamente soggettivo per il tipo di problemi da risolvere, e le scadenze coinvolte, quindi mi piacerebbe conoscere i motivi che ti farebbero scegliere una forma di ottimizzazione rispetto a un'altra.


Tutti e tre i precedenti ma voglio buttare in generale (che si riferisce alla manutenzione). Quando prendi il tuo tempo per progettare una struttura di dati davvero efficiente ampiamente applicabile alle esigenze del tuo software, per esempio, e testarla a fondo, ti servirà per anni e ti impedirà di dover scrivere molte più strutture di dati strettamente adatte alla soluzione individuale i problemi.

Risposte:


40

Manutenzione

Quindi profilare se necessario e ottimizzare per la velocità. Raramente ho mai avuto bisogno di spazio di archiviazione, almeno non negli ultimi 10 anni. Prima di quello l'ho fatto.


8
+1, se si ottimizza per la manutenibilità per iniziare, sarà più facile ottimizzarne la velocità o lo stoccaggio in un secondo momento se risulta necessario.
Carson63000,

Devi ancora considerare almeno i tempi di elaborazione e di archiviazione in modo da non scegliere un approccio estremamente eccessivo.

@ Thorbjørn, se stai ottimizzando per il tempo degli sviluppatori, probabilmente (molto probabilmente) sceglieresti gli algoritmi che sono più facili da leggere / scrivere in una determinata lingua. Solo più tardi, e solo se la performance diventa un problema, entrambi vorresti (come diceva @Tim) ritirare un profiler.
Jason Whitehorn,

@Jason, sono fortemente in disaccordo. Dovresti avere familiarità con le caratteristiche prestazionali degli algoritmi che scegli in modo da scegliere un'implementazione adatta. Vale a dire scegliere un ArrayList quando ne hai bisogno principalmente per cercare i codici postali potrebbe non ridimensionare bene.

1
@ Thorbjørn, non sono in disaccordo con te. In effetti, penso che tu abbia ragione in quanto si dovrebbe prestare attenzione agli algoritmi a portata di mano. Tuttavia, penso che le differenze nelle opinioni siano secondo me che l'idea di quali algoritmi scegliere sia qualcosa di appreso attraverso l'esperienza e risolto solo quando si presenta un problema. Hai ragione nel tuo punto, semplicemente non vedo la necessità di ottimizzare per quello a spese di meno leggibile / più lungo per implementare il codice.
Jason Whitehorn,

27

Tempo di sviluppo

L'elaborazione e lo stoccaggio sono economici. Il tuo tempo non lo è.

Solo per notare:

Questo non significa fare un brutto lavoro di scrittura del codice solo per finirlo rapidamente. Significa scrivere il codice in un modo che faciliti lo sviluppo rapido. Dipende anche interamente dai tuoi casi d'uso. Se si tratta di un semplice sito Web di due o tre pagine con un modulo di contatto, probabilmente non è necessario utilizzare un framework PHP. Un paio di include e uno script di mailer accelereranno lo sviluppo. Se il piano è invece quello di creare una piattaforma flessibile su cui crescere e aggiungere nuove funzionalità, vale la pena dedicare del tempo a disporlo correttamente e codificare di conseguenza perché accelererà lo sviluppo futuro.

Nel confronto diretto con i tempi di elaborazione e archiviazione, mi sposto verso un tempo di sviluppo più rapido. L'uso della funzione di sottrazione di collectionutils è il metodo più veloce ed efficiente in termini di memoria per sottrarre le raccolte? No! Ma è tempo di sviluppo più veloce. Se si verificano colli di bottiglia nelle prestazioni o nella memoria, è possibile risolverli in un secondo momento. L'ottimizzazione prima di sapere che cosa deve essere ottimizzato è una perdita di tempo e questo è ciò che sto sostenendo.


4
La legge di Moore è finita circa due anni fa. Potrebbe essere il momento di iniziare a pensare alla concorrenza e usare quei core extra. Questo è l'unico modo per ottenere cicli di clock economici in futuro.
Robert Harvey,

3
Per essere corretti, la legge di Moore sta ancora andando forte con un raddoppio del numero di transistor su un chip circa ogni 2 anni, il che è ciò che consente il posizionamento di più core su un singolo die. Ciò che è finito è il "pranzo libero" di un numero sempre crescente di cicli al secondo.
Dominique McDonnell,

1
"L'elaborazione e lo stoccaggio sono economici." La cache della CPU e la velocità del bus non lo sono. Sono i principali colli di bottiglia delle prestazioni oggi.
Mojuba,

3
Sono completamente d'accordo. Mantenere il codice leggibile, utilizzare gli strumenti appropriati per l'attività e aderire agli standard concordati della propria azienda ridurrà in modo significativo il tempo impiegato a digitare il codice in un computer, risparmiando all'azienda un sacco di soldi. Il tempo che dedichi è meglio dell'ingegneria che della digitazione.
Matt DiTrolio,

1
@Bill: O se stai facendo un embedded, dove potresti avere dei limiti rigidi che aumenteranno significativamente il costo del prodotto se li supererai. O per il software server, a volte - se qualcuno potesse migliorare l'elaborazione sui server di Google dell'1%, sarebbe un bel po 'di risparmio.
David Thornley,

12

L'esperienza utente.

Questo è l'unico valore che conta per il tuo cliente.

Il tempo di sviluppo è meno importante. Riesco a scrivere un'applicazione a riga di comando con tutte le funzionalità molto più velocemente di una GUI, ma se la signora Jane non riesce a capire come far uscire i rapporti che desidera, è inutile.

La manutenzione è meno importante. Posso riparare un'altalena molto rapidamente, ma se si trova nel mezzo di una foresta, gli utenti non riescono a trovarla.

Il tempo di elaborazione è meno importante. Se realizzo un'auto che va a 0 alla velocità della luce in 60 secondi, gli utenti non possono guidare.

L'estetica è meno importante. Posso dipingere una Gioconda, ma se è nascosta dietro un muro nessuno riesce a vederla.

L'esperienza utente è l'unico valore che conta. Realizzare un'applicazione che fa esattamente ciò che l'utente desidera nel modo che l'utente si aspetta è il risultato finale.


Scusa Joeri, mi sono un po 'lasciata trasportare dalla mia modifica.
Malfist,

È una wiki della comunità per qualcosa, giusto? ;)
Joeri Sebrechts,

8

C'è solo una cosa da ottimizzare ed è:

Cosa vogliono i tuoi clienti

I tuoi clienti hanno bisogno del programma più veloce possibile? Ottimizza per la velocità.

I tuoi clienti hanno bisogno di assoluta affidabilità? Ottimizza per questo.

Ne hanno bisogno consegnato domani o sarà inutile? Ottimizza per la velocità di sviluppo.

In esecuzione su un dispositivo incredibilmente limitato con risorse limitate? Ottimizza per quelle risorse.


L'unico problema è che spesso non sanno cosa vogliono o hanno aspettative su ciò che è possibile o utile.
Tim Williscroft,

1
E quando ti vengono poste quelle serie di domande a risposta multipla, molto spesso sentirai semplicemente "sì" :-)
Jason Whitehorn,

1
Non ho detto che fosse facile. E almeno se chiedi, c'è una possibilità che otterrai una risposta utile.
DJClayworth,

5

tempo di elaborazione

Il tempo del mio utente non è economico. Chi la fa l'aspetti.


Ho appena aggiornato un'applicazione che utilizzo l'anno scorso. Avevano completamente riscritto l'app e il ragazzo era lento. Alla fine ho dovuto acquistare un nuovo computer per eseguirlo rapidamente. Ti garantisco che non era economico, ma il mio tempo è più prezioso.


Interpretazione interessante della pendenza del tempo di elaborazione. Vuoi condividere il tipo di applicazioni che sviluppi? Sono incuriosito.
Jason Whitehorn,

1
Il tempo di elaborazione è importante se si esegue su molti computer. Ad esempio, se è una scelta tra passare altri 2 mesi a ottimizzare o aggiornare 10.000 PC a hardware più recente, in tal caso il tempo dello sviluppatore non vince. Ma ovviamente è un compromesso. Se si esegue solo su una mezza dozzina di server, il tempo dello sviluppatore probabilmente vince in quel caso.
Dean Harding,

1
@Jason, ora mi è facile lavorare con Excel e VBA in un conglomerato di fogli di calcolo (che mi sono condensato rapidamente). I miei utenti lavorano nella stanza accanto e mi fanno sapere se ho qualche problema. La mia prospettiva viene dall'uso dei computer per trent'anni e la visione delle applicazioni continua a gonfiarsi, costringendo gli aggiornamenti a compensare troppo. So che gli sviluppatori possono fare di meglio, devono solo prendere l'abitudine di scrivere codice efficiente.

+10 per il codice efficiente. È troppo spesso trascurato, specialmente nella programmazione modulare. Ogni modulo funziona a una velocità ragionevole, ma la somma di tutti può essere terribilmente lenta.
Joris Meys,

4

Tendo a inclinare verso la limitazione del consumo di memoria e delle allocazioni. So che è vecchia scuola, ma:

  • La maggior parte del codice non buttabile che scrivo è fortemente parallelo. Ciò significa che un'eccessiva attività di allocazione della memoria e di garbage collection serializzerà molto codice altrimenti parallelizzabile. Significa anche che ci saranno molte contese per un bus di memoria condiviso.
  • La mia lingua principale è D, che non ha ancora un buon supporto a 64 bit (anche se questo è stato risolto).
  • Lavoro con set di dati abbastanza grandi su base regolare.

+1 per lavorare per prevenire bloatware. I programmi di memorizzazione della memoria sono programmi errati.

I programmi di memorizzazione della memoria possono essere eseguiti su sistemi a 64 bit, in generale. Questo è quello che abbiamo fatto quando una delle nostre app ha riscontrato problemi di memoria (utilizza legittimamente grandi quantità di memoria). Il primo punto elenco è importante quando le prestazioni lo sono.
David Thornley,

2

Direi che ottimizzo verso l'efficienza, con efficienza definita come un compromesso tra tempo di sviluppo, manutenibilità futura, esperienza utente e risorse consumate. Come sviluppatore devi destreggiarti per mantenere un certo equilibrio.

Come si raggiunge questo equilibrio? Bene, prima devi stabilire alcune costanti, come ad esempio la scadenza, l'hardware su cui verrà eseguita l'applicazione e il tipo di persona che la utilizzerà. Senza conoscerli non è possibile stabilire l'equilibrio corretto e stabilire le priorità dove è necessario.

Ad esempio, se stai sviluppando un'applicazione server su una macchina potente, potresti voler compromettere l'efficienza delle prestazioni per assicurarti di rispettare una scadenza immobile. Tuttavia, se il tuo sviluppatore è un'applicazione che deve rispondere rapidamente all'input dell'utente (pensa a un videogioco), allora devi dare la priorità alla tua routine di input per assicurarti che non sia in ritardo.


2

Qualunque sia la tecnologia di virtualizzazione che sto usando

Ricordi i giorni in cui i sistemi con più di 512 MB di RAM erano considerati bleeding edge? Passo i miei giorni a scrivere il codice per il precedente.

Lavoro principalmente su programmi di basso livello che girano sul dominio privilegiato in un ambiente Xen. Il nostro limite per il dominio privilegiato è di 512 MB, lasciando il resto della RAM libero per i nostri clienti. È anche tipico per noi limitare il dominio privilegiato a un solo core della CPU.

Quindi eccomi qui, a scrivere codice che verrà eseguito su un nuovissimo server da $ 6k, e ogni programma deve funzionare (idealmente) entro un limite allocato di 100kb, o evitare completamente l'allocazione dinamica della memoria.

In breve, ottimizzo per:

  • Impronta di memoria
  • Sorta (dove la maggior parte del mio codice passa la maggior parte del tempo)

Devo anche essere estremamente diligente quando si tratta di tempo trascorso in attesa di blocchi, in attesa di I / O o semplicemente in attesa in generale. Una parte considerevole del mio tempo va nel miglioramento delle librerie socket esistenti non bloccanti e nella ricerca di metodi più pratici di programmazione senza blocchi.

Ogni giorno trovo un po 'ironico il fatto che scrivo codice proprio come ho fatto 15 anni fa, su sistemi acquistati il ​​mese scorso, a causa dei progressi della tecnologia.

Questo è tipico per chiunque lavori anche su piattaforme embedded, anche se molti di questi hanno almeno 1 GB a disposizione. Come sottolinea Jason, è anche tipico quando si scrivono programmi da eseguire su dispositivi mobili. L'elenco potrebbe continuare, chioschi, thin client, cornici, ecc.

Sto iniziando a pensare che le restrizioni hardware separino davvero i programmatori dalle persone che possono far funzionare qualcosa senza preoccuparsi di ciò che effettivamente consuma. Mi preoccupo (votatemi verso il basso, se necessario), quali linguaggi quel tipo completamente astratto e la memoria controllano il pool collettivo di buon senso che (era solito) condiviso tra i programmatori di varie discipline.


1
+1 per l'angolo di stampa del piede di memoria. Non ho mai codificato contro i vincoli particolari con cui hai a che fare, ma rimuovi la prima sezione parlando di Xen e sostituiscilo con iPhone e so esattamente da dove vieni :-)
Jason Whitehorn

2

Risultati della ricerca

Come accademico, ho pensato di condividere ciò per cui ottimizzo. Nota che questo non è esattamente lo stesso dell'ottimizzazione per un tempo di sviluppo più breve. Spesso significa che il lavoro potrebbe supportare alcune domande di ricerca, ma non essere un prodotto affidabile e raffinato. Questo potrebbe essere visto come un problema di qualità e potrebbe spiegare perché molti affermano che gli informatici (accademici) non hanno alcuna esperienza nel "mondo reale". (Ad esempio, "Non saprebbero come sviluppare un prodotto consegnabile altrimenti?" )

È una linea sottile. In termini di impatto, vuoi che il tuo lavoro venga utilizzato e citato da altri, e l'effetto iceberg di Joel entra in gioco: un po 'di lucentezza e brillantezza possono fare molto. Ma se non stai creando una base su cui costruire altri progetti, potresti non essere in grado di giustificare il tempo impiegato per realizzare un prodotto consegnabile.


1
  1. Design
    • accoppiamento basso, modulare
    • aree concise, ben definite, funzionali
    • Ben documentato
    • refattore continuo per cruft
  2. Maintenence
    • build e debug riproducibili
    • test unitari
    • test di regressione
    • controllo della fonte

... dopo tutto il resto

... infine, ottimizza per le prestazioni ;-)


1

Qualità / Test

Ottimizza verso la qualità, in quanto garantisce che ci sia tempo nel programma di sviluppo per i test, sia per i test unitari che per i test dopo funzionalità / fasi.


1

Dipende dalle necessità del tuo programma.

Gran parte di ciò che faccio è fortemente ostacolato dalla capacità di elaborazione e dalla memoria, ma non subisce molti, se del caso, cambiamenti significativi nell'anno medio.

In passato ho lavorato a progetti in cui il codice viene cambiato frequentemente, quindi la manutenibilità diventa più importante in quei casi.

In passato ho anche lavorato su sistemi in cui la quantità di dati è il problema più significativo, anche su disco per l'archiviazione, ma più comunemente la dimensione diventa un problema quando devi spostare i dati molto o su un lento collegamento.


1

Elegance .

Se il tuo codice è ben progettato, avrà diversi effetti:

  1. Sarà più facile da mantenere (riducendo i costi per il cliente)
  2. Sarà più facile da ottimizzare (per JIT o compilatori completi)
  3. Sarà più facile da sostituire (quando si pensa a una soluzione migliore)


0

Dato che eseguo installazioni su più tipi di sistemi, dai mainframe IBM ai PC, ottimizzo prima la compatibilità, quindi le dimensioni, quindi la velocità.


0

Dipende

Se stai lavorando su un sistema di elaborazione video incorporato in tempo reale, ottimizzi la velocità di elaborazione. Se stai lavorando su un word processor, ottimizzi i tempi di sviluppo.

Tuttavia, in tutti i casi il codice deve funzionare e deve essere mantenibile.


0

Espressività del mio intento.

Voglio che qualcuno che legge il mio codice sia in grado di vedere facilmente quali operazioni stavo cercando di invocare sul dominio. Allo stesso modo cerco di minimizzare la spazzatura non semantica (parentesi graffe, parole chiave "funzione" in js, ecc.) Per facilitare la scansione.

Ovviamente devi bilanciarlo con la manutenibilità. Adoro scrivere funzioni che restituiscono funzioni e ogni sorta di tecniche avanzate e FANNO ulteriormente il mio obiettivo, ma se il vantaggio è lieve, sbaglierò sul lato di attenermi a tecniche che i solidi programmatori jr avrebbero familiarità.


-6

Tutti loro

Tempo di elaborazione

I computer di oggi sono veloci, ma tutt'altro che sufficienti. Esistono molte situazioni in cui le prestazioni sono fondamentali, se si eseguono streaming di server multimediali.

Conservazione

Il tuo cliente potrebbe avere un disco grande, diciamo, 1 TB. Quale può essere ripreso da 1000 film HD, se vuoi renderlo un servizio è tutt'altro che sufficiente, non è vero?

Tempo di sviluppo

Beh, non sono sicuro che questo valga come "ottimizzazione", quello che faccio è usare Java invece di C ++ e lo sviluppo diventa 10 volte più veloce. Sento che sto dicendo ciò che penso direttamente al computer, molto direttamente avanti e totalmente rock!

A proposito, credo che per accelerare lo sviluppo del tuo processo di sviluppo, dovresti scegliere Java, non provare mai spazzatura come Python ... che sostiene che possono abbreviare il tuo tempo DEV.


Potresti trovare interessante questa lettura: paulgraham.com/avg.html - illustra la forza dei linguaggi di programmazione.

3
Con tempo e budget limitati, non è possibile dedicare del tempo a tutti loro - ci deve essere una priorità.
JBR Wilkinson,

@JRBWilkinson Bene, dovrebbe essere caso per caso
toto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.