È importante che una soluzione sia efficiente?

9

Risolvo molti problemi, principalmente da Top Coder. Avrò risposte per molti, ma la maggior parte delle volte finisco con una soluzione inefficiente.

Nelle implementazioni del mondo reale - è davvero importante che una soluzione al problema sia efficiente? Se sì, come posso migliorarlo?

    
posta Ant's 13.02.2012 - 02:58
fonte

6 risposte

34

La soluzione migliore è quella che è (in ordine di importanza crescente) efficiente, mantenibile e fatta .

^^^ Questa è l'unica cosa che devi veramente prendere da questa risposta. ^^^

L'efficienza è importante . Forse un po 'meno di quanto lo fosse a causa della nostra abbondanza di hardware, ma Le prestazioni sono una caratteristica . In un contesto, l'efficienza è ovviamente importante. Dovresti sapere come scrivere codice efficiente. Ancora più importante, dovresti conoscere le migliori pratiche che produrranno un codice efficiente e di buona esecuzione senza sacrificare la tempestività o la manutenibilità di un'applicazione. Questo è davvero il luogo in cui la profondità di esperienza con una piattaforma e un linguaggio restituisce molti rendimenti.

Più importante però (nel 95% dei casi), sta avendo una soluzione rifinita e manutenibile. Senza un prodotto finito , non importa quanto efficiente o gestibile la soluzione. Se ti occorre una quantità straordinaria di tempo per tracciare e correggere un bug o aggiungere una nuova funzionalità, non importa quanto sia efficiente la soluzione. Ma l'efficienza e le prestazioni sono senza dubbio importanti, indipendentemente da quello che qualcuno potrebbe dire.

    
risposta data 13.02.2012 - 05:25
fonte
8

Sono d'accordo con Mike Cellini, l'unica cosa che aggiungerei è

C'è qualcosa di "abbastanza efficiente"? Ad esempio dal punto di vista dell'utente, non c'è molta differenza tra una funzione che si completa in 0,00001 secondi o una che si completa in 0,1 secondi, anche se una è molto più efficiente dell'altra. Una funzione che si completa in 10 minuti non è molto diversa (per l'utente) a quella che completa in 12 minuti. In entrambi i casi, l'utente potrebbe prendere una tazza di caffè o andare avanti con un'altra attività.

Sono arrivato a vedere l'efficienza come "un utente efficiente" non un algoritmo efficiente.

    
risposta data 13.02.2012 - 11:54
fonte
2

In generale, la soluzione più importante per un problema sarà quella effettivamente esistente ed è valida per i casi così come esistono per il tuo problema. In altre parole, evita l'ottimizzazione prematura fino a quando non sai che hai un codice inefficiente o un codice efficiente che deve essere più veloce.

Inoltre, non dimenticare che la soluzione migliore per la tua applicazione potrebbe non essere la soluzione generale. Caso e punto, un paio di anni fa un professore ha dato alla nostra classe un problema in cui dovevamo stampare i primi 10 numeri di un dato tipo (scusate, la mia memoria non mi soddisfa per il tipo, ma era uno dei numeri più insoliti classi) e ci è stato dato un test per verificare che il numero fosse il tipo dato. Questa è stata la portata del problema che ci è stato dato e ci è stato detto che era dovuto il giorno successivo con la soluzione più efficiente che ha ricevuto pieno credito. La seguente lezione del professore riassume i risultati:

  • Alcuni studenti hanno utilizzato un semplice ciclo e la formula fornita per verificare che i numeri fossero corretti e li hanno visualizzati, lentamente ma hanno svolto il lavoro, O (n ^ 3).
  • Gli altri studenti hanno fatto la loro ricerca e hanno trovato una formula che ha fatto un lavoro migliore di controllo per garantire che un determinato numero fosse valido, questi programmi sono stati eseguiti molto più velocemente, O (n ^ 2).
  • Uno studente ha utilizzato la formula lenta per generare i valori e poi li ha copiati in un array costante nel loro codice e ne ha visualizzato il contenuto, O (n).

La soluzione finale è stata giudicata la più efficiente dal professore. Risulta che il problema era in realtà un esercizio di comprensione completa del problema e non solo di uscire e trovare la soluzione più efficiente.

Il punto di cui sopra è che quando si tratta di trovare una soluzione efficiente un problema, in genere è meglio passare il tempo per assicurarsi di capire veramente quale sia il problema prima di uscire e scrivere codice, o tentare di ottimizzare il codice . Se è possibile memorizzare un set di valori di riferimento in un array costante, è meglio farlo dal punto di vista delle prestazioni piuttosto che provare a scrivere un algoritmo elaborato.

Allo stesso modo, non dimenticare che per la maggior parte delle applicazioni, le uniche persone che tendono a vedere codice inefficiente (quando non è inutilmente inefficiente!) sono gli sviluppatori stessi. Se scrivi un codice pulito che fa esattamente ciò che deve fare, allora le probabilità sono che la maggior parte delle volte gli utenti non noteranno problemi di prestazioni quando lavorano con il tuo programma e quando fanno semplicemente ottimizzare le parti che menzionano per te.

    
risposta data 13.02.2012 - 13:38
fonte
2

Dipende dalla struttura del concorso, ma in generale, sì: le prestazioni sono una considerazione la maggior parte delle volte, secondo loro documentazione . A volte, come nel link successivo, devi cacciare, ma per citare:

Write clean, clear, efficient code. Even though there is no review line item specifically for this, reviewers are nevertheless likely to react better to code that is easy for them to read and understand. With efficient code you get a potential performance advantage in stress and benchmark testing, as well as likely kudos (and a few extra points) from the reviewers.

Il modo migliore per migliorare in questo è scrivere codice che sia efficiente, cosa che stai già facendo. Anche se completi il lavoro, dedica del tempo a migliorarne l'efficienza, anche dopo la competizione, e questo ti ripagherà.

Probabilmente vorrai anche investire in teoria, come libri sugli algoritmi , che possono darti due cose : strumenti più efficienti per risolvere un problema specifico e meccanismi più efficienti per identificare quale sia il problema da risolvere.

Infine, i corsi di informatica sono sempre più disponibili online e coprirà lo sfondo che devi migliorare.

    
risposta data 13.02.2012 - 03:05
fonte
1

Quanto deve essere efficiente una soluzione dipende da una serie di fattori. La cosa più importante è sapere cosa vuole il tuo utente. Ecco alcuni esempi.

  1. Se sei l'unico utente di un blocco di codice e funziona perfettamente per te, allora probabilmente stai bene.
  2. Se il tuo programma sarà venduto, devi avere in mente una piattaforma di destinazione. Provalo con questa piattaforma. Se il programma è eccezionalmente lento, è necessario lavorare per renderlo più efficiente. Se ti sembra soddisfacente, consegnalo agli altri utenti e verifica se sono d'accordo.
  3. Forse il programma ha altre considerazioni. Se stai costruendo, diciamo, un programma basato su server, allora potresti aver bisogno di lavorare molto duramente per rendere il programma il più efficiente possibile. Oppure, se funziona su un microprocessore, assicurati che funzioni anche lì.

Come rendere il tuo codice più efficiente:

  1. Il primo passo è farsi un'idea di ciò che sta impiegando più tempo. Il trucco è fare qualcosa chiamato codice di profilazione. Cerca ciò che richiede più tempo e vedi se riesci a trovare un modo per farlo funzionare più rapidamente.
  2. Forse il fattore limitante chiave è la memoria. In questo caso, cerca ciò che sta occupando grandi blocchi di memoria e osserva come potresti ridurlo.

C'è un intero campo per l'ottimizzazione, ma i due suggerimenti sopra dovrebbero almeno iniziare.

    
risposta data 13.02.2012 - 03:10
fonte
1

Per una competizione devi capire chi sono i giudici e di cosa si tratta - se sono alla ricerca di grandi programmatori e niente di più, allora otterrai riconoscimenti per un codice più efficiente.

Di norma, nel mondo reale, non importa. Una delle idee chiave dello sviluppo del software è "Non ottimizzare ciò che non si conosce ha bisogno di ottimizzare", quindi "Ottimizza solo quando è stato dimostrato che è necessario"

Molti praticanti sostengono che ciò porta a un codice gonfio e inefficiente che non può essere risolto facilmente, e in alcuni casi limite (che chiameranno come se questo è quello che la maggior parte dei programmatori fa tutto il giorno ogni giorno) sono corretti. Tuttavia, non molti progetti di sviluppo software hanno risultati misurati "Performance: Più veloce del necessario, Costo: A chi importa, Tempi di consegna: A volte questo decennio", Nel mondo reale, di solito è "Lo voglio a buon mercato, lo voglio ieri, voglio funziona ".

    
risposta data 13.02.2012 - 04:08
fonte

Leggi altre domande sui tag