Per cosa ottimizzi? [chiuso]

19

In generale, che tipo di ottimizzazioni ti piacciono tipicamente quando progetti il software?

Sei il tipo che preferisce ottimizzare il tuo design per

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

Ovviamente questo è molto soggettivo per il tipo di problemi da risolvere e le scadenze coinvolte, quindi mi piacerebbe sapere quali sono i motivi che ti spingono a scegliere una forma di ottimizzazione rispetto a un'altra.

    
posta Jason Whitehorn 09.11.2010 - 04:42
fonte

18 risposte

40

Manutenzione

Quindi, se necessario, profilare e ottimizzare per la velocità. Raramente ho mai avuto bisogno di deposito - almeno non negli ultimi 10 anni. Prima di quello che ho fatto.

    
risposta data 09.11.2010 - 22:21
fonte
27

Tempo di sviluppo

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

Solo per notare:

Questo non significa fare un brutto lavoro di scrittura del codice solo per terminarlo rapidamente. Significa scrivere il codice in una maniera 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 per disporre correttamente e codificare di conseguenza perché accelererà lo sviluppo futuro.

Nel confronto diretto con i tempi di elaborazione e archiviazione, mi propongo per un tempo di sviluppo più veloce. La sottrazione della collectionutils sta utilizzando il metodo più rapido e più efficiente in termini di memoria per sottrarre le raccolte? No! Ma è più veloce il tempo di sviluppo. Se ti imbatti in colli di bottiglia nelle prestazioni o nella memoria, puoi risolverli in seguito. Ottimizzare prima di sapere cosa deve essere ottimizzato è un spreco di tempo e questo è ciò a cui sto difendendo.

    
risposta data 09.11.2010 - 17:37
fonte
12

Esperienza utente

Questo è l'unico valore che interessa al tuo cliente.

Il tempo di sviluppo è meno importante. Posso scrivere un'applicazione della riga di comando con tutte le funzionalità molto più velocemente di una GUI, ma se la signora Jane non riesce a capire come sputare fuori i report che vuole, è inutile.

Manutenzione è meno importante. Posso riparare a un'altalena molto velocemente, ma se si trova nel mezzo di una foresta, gli utenti non riescono a trovarlo.

Tempo di elaborazione è meno importante. Se faccio un'auto che va 0 alla velocità della luce in 60 secondi, gli utenti non possono sterzare.

Estetica è meno importante. Posso dipingere una Monna Lisa, ma se è nascosta dietro un muro nessuno la vede.

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

    
risposta data 08.02.2012 - 20:39
fonte
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 affidabilità assoluta? Ottimizza per questo.

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

Funzionando su un dispositivo con risorse limitate incredibilmente piccolo? Ottimizza per quelle risorse.

    
risposta data 09.11.2010 - 17:35
fonte
5

Tempo di elaborazione

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

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

    
risposta data 09.11.2010 - 05:03
fonte
4

Tendo a limitare il consumo di memoria e le allocazioni. So che è vecchia scuola, ma:

  • La maggior parte del codice non throwaway che scrivo è strongmente parallela. Ciò significa che l'eccessiva allocazione della memoria e l'attività di garbage collection serializzeranno un sacco di codice altrimenti parallelizzabile. Significa anche che ci sarà un sacco di contesa per un bus di memoria condivisa.
  • La mia lingua principale è D, che non ha ancora un buon supporto a 64 bit (sebbene questo sia stato risolto).
  • Lavoro con set di dati abbastanza grandi su base regolare.
risposta data 09.11.2010 - 04:58
fonte
2

Direi che ottimizzo l'efficienza, definendo l'efficienza come un compromesso tra tempo di sviluppo, manutenzione futura, esperienza utente e risorse consumate. Come sviluppatore devi manipolare tutti questi elementi per mantenere una sorta di equilibrio.

Come raggiungi questo equilibrio? Bene, per prima cosa è necessario stabilire alcune costanti, ad esempio la scadenza, l'hardware su cui verrà eseguita l'applicazione e il tipo di persona che lo utilizzerà. Senza saperlo non è possibile stabilire il giusto equilibrio e stabilire la 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 raggiungere una scadenza immutabile. Tuttavia, se il tuo sviluppatore un'applicazione che deve rispondere rapidamente all'input dell'utente (pensa un videogioco), devi dare la priorità alla tua routine di input per assicurarti che non sia laggoso.

    
risposta data 09.11.2010 - 10:44
fonte
2

Qualunque sia la tecnologia di virtualizzazione che sto usando

Ricordate i giorni in cui i sistemi con più di 512 MB di RAM erano considerati all'avanguardia? Trascorro le mie giornate scrivendo il codice per il priore.

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

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

Concisamente, ottimizzo per:

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

Devo anche essere estremamente diligente quando si tratta di trascorrere del tempo in attesa di serrature, in attesa di I / O o semplicemente in attesa in generale. Una parte considerevole del mio tempo è dedicata al miglioramento delle librerie di socket non bloccanti esistenti e alla ricerca di metodi più pratici per programmare senza blocchi.

Ogni giorno trovo un po 'ironico che sto scrivendo codice proprio come ho fatto 15 anni fa, su sistemi che sono stati acquistati il mese scorso, a causa di avanzamenti nella tecnologia.

Questo è tipico per chiunque lavori anche su piattaforme embedded, sebbene anche molte di queste abbiano almeno 1 GB a disposizione. Come sottolinea Jason, è anche tipico quando si scrivono programmi da eseguire su dispositivi mobili. L'elenco continua, Chioschi, thin client, cornici, ecc.

Sto iniziando a pensare che le restrizioni hardware separino davvero i programmatori da persone che possono far funzionare qualcosa senza preoccuparsi di ciò che effettivamente consuma. Mi preoccupo (in basso vota se è necessario) quali sono le lingue che tipo e memoria completamente astratte controllano il pool di buonsenso che (usato per essere) condiviso tra i programmatori di varie discipline.

    
risposta data 09.11.2010 - 14:05
fonte
2

Risultati di ricerca

Come accademico, ho pensato che dovrei condividere ciò che ottimizzo per. Si noti che questo non è esattamente la stessa cosa 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 consegnabile e lucido. Questo potrebbe essere considerato un problema con la qualità, e potrebbe spiegare perché molti dicono che gli scienziati informatici (accademici) non hanno alcuna esperienza del "mondo reale". (Ad es., "Non saprebbero come sviluppare un prodotto consegnabile in altro modo?" )

È una linea sottile. In termini di impatto, vuoi che il tuo lavoro sia usato e citato da altri, e Effetto Iceberg di Joel entra in gioco : un po 'di lucentezza e lucentezza può 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.

    
risposta data 09.11.2010 - 15:55
fonte
1
  1. design
    • accoppiamento basso, modulare
    • aree concise, ben definite, funzionali
    • ben documentato
    • refactoring continuo per cruft
  2. Maintenence
    • build e debug riproducibili
    • unit test
    • test di regressione
    • controllo del codice sorgente

... dopodiché tutto il resto

... infine, ottimizza le prestazioni; -)

    
risposta data 09.11.2010 - 06:57
fonte
1

Qualità / Test

Ottimizza verso la qualità, come nel garantire che ci sia tempo nella pianificazione dello sviluppo per i test, sia in fase di test unitario che di test dopo caratteristiche / fasi.

    
risposta data 09.11.2010 - 11:45
fonte
1

Dipende dalle necessità del tuo programma.

La maggior parte di ciò che faccio è vincolato pesantemente dalla capacità di elaborazione e dalla memoria, ma non passa attraverso molti, se nessuno, cambiamenti significativi nell'anno medio.

In passato ho lavorato su progetti in cui il codice viene modificato di frequente, quindi in questi casi la manutenibilità diventa più importante.

Ho anche lavorato su sistemi in passato in cui la quantità di dati è il problema più significativo, anche su disco per l'archiviazione, ma più comunemente le dimensioni diventano un problema quando devi spostare i dati molto, oppure su un collegamento lento.

    
risposta data 09.11.2010 - 16:47
fonte
1

Elegance .

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

  1. Sarà più semplice da mantenere (riduzione dei costi per il cliente)
  2. Sarà più facile ottimizzare (per JIT o compilatori completi)
  3. Sarà più facile da sostituire (quando pensi a una soluzione migliore)
risposta data 09.11.2010 - 18:49
fonte
0

Tempo di sviluppo, assolutamente. Ottimizzo anche la larghezza di banda, ma non vado in binario.

    
risposta data 09.11.2010 - 07:02
fonte
0

Da quando eseguo installazioni su più tipi di sistemi, da IBM mainframe a PC, per prima cosa ottimizzo per compatibilità, dimensioni e velocità.

    
risposta data 09.11.2010 - 22:27
fonte
0

Dipende

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

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

    
risposta data 09.11.2010 - 22:42
fonte
0

Espressività delle mie intenzioni.

Voglio che qualcuno leggendo il mio codice sia in grado di vedere facilmente quali operazioni stavo cercando di invocare sul dominio. Allo stesso modo, cerco di minimizzare la posta indesiderata non semantica (parentesi, parole chiave 'function' in js, ecc.) Per semplificare la scansione.

Naturalmente devi bilanciarlo mantenendo la manutenibilità. Adoro scrivere funzioni che restituiscono funzioni e ogni sorta di tecniche avanzate e FANNO più lontano il mio obiettivo, ma se il beneficio è leggero, mi sbaglierò sul lato di attenermi alle tecniche con cui i programmatori solidi jr avrebbero familiarità.

    
risposta data 08.02.2012 - 20:16
fonte
-6

Tutti loro

Tempo di elaborazione

I computer di oggi sono veloci, ma lontani da quello che è abbastanza. Esistono molte situazioni in cui le prestazioni sono fondamentali, se si esegue lo streaming di server multimediali.

archiviazione

Il cliente potrebbe avere un grande disco, diciamo, 1 TB. Che può essere ripreso da 1000 film in HD, se vuoi renderlo un servizio è abbastanza lontano, non è vero?

Tempo di sviluppo

Beh, non sono sicuro che se questo conta come "ottimizzazione", quello che faccio è usare Java invece di C ++, e lo sviluppo diventa 10 volte più veloce. Mi sento come se stessi dicendo quello che penso direttamente al computer , molto semplice e totalmente rock!

BTW Credo che per velocizzare lo sviluppo del tuo processo di sviluppo dovresti scegliere java, non provare mai i rifiuti come python ... il che afferma che possono abbreviare il tempo di DEV.

    
risposta data 09.11.2010 - 06:07
fonte

Leggi altre domande sui tag