Dovresti sacrificare la leggibilità del codice con quanto è efficiente il codice? [chiuso]


37

Dovresti sacrificare la leggibilità del codice con quanto è efficiente il codice?

ad es. 3 righe di codice in 1 riga.

Ho letto in Code Craft di Pete Goodliffe che la leggibilità è la chiave.

I vostri pensieri?


13
Perché pensi che il codice con meno righe sia probabilmente più efficiente? Questo è raramente il caso dei linguaggi moderni, anche se potrebbe essere stato applicato agli interpreti BASIC a 8 bit.
David Thornley,

69
Né la leggibilità né le prestazioni sono misurate in linee.

In pochissimi casi, sacrificherei la leggibilità per la velocità, ma molto raramente. Il codice incorporato che esegue macchinari ad alta velocità è un caso. Per la maggior parte dei software, la leggibilità è molto più importante.
Jim C,


Preferirei sempre la leggibilità finché le prestazioni non diventano un problema. Quindi inizierei a preoccuparmi.
Pete,

Risposte:


62

"Meno linee" non è sempre la stessa cosa di "più efficiente". Presumo tu intenda "Se un programma dovesse essere abbreviato a spese della leggibilità".

I programmi devono essere scritti per essere letti dalle persone e solo per inciso per l'esecuzione delle macchine.

-Abelson & Sussman, Struttura e interpretazione dei programmi per computer

In generale, penso che sia più importante che un programma sia facilmente comprensibile che essere breve. Dovrei notare, tuttavia, che accorciare un programma spesso lo rende anche più leggibile (c'è l'ovvia soglia a cui arrivi quando il tuo codice inizia a sembrare un rumore di linea, ma fino a quel momento, esprimere qualcosa in modo più succinto sembra renderlo più chiaro).

Esistono specifiche eccezioni (come i tuoi script di shell personali o uno dei codici di munging dei dati) che nessuno dovrà mai mantenere e solo tu avrai mai bisogno di leggere. In quella situazione, probabilmente va bene sacrificare un po 'di leggibilità per convenienza fintanto che puoi ancora capirla.


3
+1 Ci sono rendimenti decrescenti, ma ho anche scoperto che un programma corto è generalmente più facile da leggere di uno lungo.
Michael K,

23
Purtroppo, ho trovato che un codice di munging dei dati una tantum che non viene immediatamente eliminato si trasforma in codice a lungo termine, troppo spesso. Aspettati sempre che le cose rimangano sospese, vengano riutilizzate e ampliate, a meno che tu non elimini il codice.
Vatine,

1
Sono d'accordo con Vatine. Sei mai tornato indietro e hai provato a capire qualcosa che una volta pensavi fosse "perfettamente chiaro" quando?
Wonko the Sane,

+ 1 per SICP. Libro fantastico
Jason Yeo

30

A Volte si.

La leggibilità è una buona cosa per cui lottare. La maggior parte del codice scritto per le tipiche applicazioni line-of-business sarà abbastanza performante e concentrarsi sulla leggibilità è importante. In aree più esigenti in termini di prestazioni (come la programmazione di videogiochi o il calcolo pesante), può essere importante rinunciare alla leggibilità a favore dell'uso di una particolare funzione linguistica che è orribilmente illeggibile e tuttavia incredibilmente performante.

Per un esempio di quest'ultimo, vedi l'articolo di Fast Inverse Square Root su Wikipedia.

In genere penso che sia meglio rendere prima leggibile qualcosa e preoccuparsi delle prestazioni dopo, a condizione che vengano prese precauzioni di buon senso come non scegliere un algoritmo O (n ^ 2) su O (n). Sacrificare la leggibilità solo per brevità è, secondo me, fuorviato.


4
Penso che potrebbe esserci una differenza tra "codice leggibile" e "conoscere l'algoritmo". Immagino che qualsiasi codice, se non conosci l'algoritmo, sarà più o meno difficile da leggere e comprendere. Ad esempio nel caso FISR menzionato, il codice semplice è in realtà abbastanza leggibile, ma l'algoritmo non è documentato. Se conoscessi l'algoritmo FISR quanto più leggibile potresti scrivere il codice? Una domanda strettamente correlata potrebbe essere: quando scegliere un algoritmo elaborato?
Maglob,

@Maglob Mi riferivo specificamente all'uso di 0x5f3759df. Indipendentemente dalle prestazioni, è possibile utilizzare implementare l'algoritmo ISR utilizzando la divisione regolare, che sarebbe probabilmente più leggibile per una persona che non ha familiarità con gli interni del computer.
Adam Lear

3
Questo potrebbe forse essere espresso come "Talvolta è corretto sostituire un algoritmo ingenuo espresso in 5 righe di commenti e 20 righe di codice con un algoritmo sofisticato espresso in 15 righe di commenti e 5 righe di codice".
Peter Taylor,

1
Tieni inoltre presente che ciò che offuscare orribilmente offuscamento a uno sviluppatore in un dominio può essere un linguaggio perfettamente accettabile per uno sviluppatore in un altro dominio. Mentre la costante magica dell'algoritmo ISR sembra aver spinto un po 'i limiti, immagino che al momento quel tipo di hacking a livello di bit per approssimazioni in virgola mobile fosse abbastanza comune nello sviluppo del gioco in quel momento. Allo stesso modo, lavorando in sistemi embedded ci sono molte cose che sono idiomatiche ma potrebbero sembrare eccessivamente ottuse per uno sviluppatore di applicazioni.
Cercerilla,

una delle meraviglie di Internet -> quando si implementa un algoritmo complesso (esempio: distanza di levenshtein con l'ottimizzazione diagonale ... ci sto solo lavorando;)), si può fare riferimento a un articolo o persino copiare l'articolo nella documentazione del progetto e inserire un riferimento nel codice. In questo modo le persone che conoscono gli algoritmi seguono semplicemente i commenti che spiegano specifici test / ottimizzazioni, mentre i principianti dovranno prima leggere l'algoritmo e poi tornare all'implementazione.
Matthieu M.,

22

L'unica volta in cui sacrificherei la leggibilità sarebbe quando il codice avrebbe mostrato un collo di bottiglia nelle prestazioni e una riscrittura lo avrebbe risolto. In tal caso, l' intenzione del codice deve essere ben documentata in modo tale che, in caso di bug, possa essere rintracciata più facilmente.

Ciò non significa che la riscrittura debba essere illeggibile ovviamente.


22

L'ho citato prima e lo citerò di nuovo:

Rendilo corretto,
chiariscilo,
rendilo conciso, rendilo
veloce.

In questo ordine.

Wes Dyer


2
+1 Stavo scorrendo rapidamente verso il basso per assicurarmi che questa citazione fosse inclusa. Ora non devo inserire una risposta. :-)
RationalGeek

9

Dovresti sacrificare la leggibilità del codice con quanto è efficiente il codice?

In termini di codice, è sempre bello essere auto-documentati. Ma a volte non può succedere. A volte è necessario ottimizzare e talvolta quel codice non è di per sé molto leggibile.

Questo è ciò per cui sono stati inventati i commenti . Usali. Anche l'assemblaggio ha commenti. Se hai scritto una massa di codice e non c'è un commento in vista, sono preoccupato. I commenti non influiscono sulle prestazioni del tempo di esecuzione, ma alcune note su ciò che sta succedendo aiutano sempre.

A mio avviso, non ci sono assolutamente scuse per non avere alcuni commenti di base. Chiaramente if ( x == 0 ) /* check if x is 0 */è totalmente inutile; non dovresti aggiungere rumore inutile al codice, ma qualcosa del genere:

; this is a fast implementation of gcd
; in C, call as int gcd(int a, int b)
; args go in rdi, rsi, rcx, r8, r9
gcd:
    push rdp
    ; ...

È abbastanza utile.


6

Dovresti sacrificare la leggibilità del codice con quanto è efficiente il codice?

Se l'efficienza è il tuo obiettivo attuale (come nella fase di ottimizzazione) e sai - hai metriche, vero? - quella linea (e) di codice è l'attuale collo di bottiglia, quindi sì.

Altrimenti no: la leggibilità consentirà a te (o ad un altro) di poter modificare questo codice in un secondo momento per renderlo più efficiente, poiché è più facile da capire.


4

Nessuno vince Code Golf

ad es. 3 righe di codice in 1 riga

Un'idea particolarmente terribile.

Costo per giocare a golf - molto alto.

Costo per mantenere programmi illeggibili - astronomici.

Valore di questo tipo di codice minimizzato - zero. Funziona ancora, ma non funziona "meglio".

Efficienza scelta con saggezza

Costo per scegliere l'algoritmo e la struttura dati corretti - moderato.

Costo per mantenere l'algoritmo e la struttura dati corretti - basso.

Valore dell'algoritmo e della struttura dati corretti - elevato. L'uso delle risorse è basso.

Foolish ("micro-ottimizzazione") Efficienza

Costo per giocare a micro-ottimizzazione - alto.

Costo per mantenere il codice illeggibile, micro-ottimizzato - molto elevato.

Il valore di micro-ottimizzazione - varia. Quando qui c'è un valore diverso da zero, i costi lo superano comunque.


2

Dipende da se stiamo parlando di efficienza in termini di velocità di esecuzione del codice o efficienza in quanto lo sviluppatore può scrivere il codice. Se stai sacrificando la leggibilità del codice a favore della possibilità di digitare il codice molto velocemente, probabilmente ti ritroverai a pagare il tempo indietro in termini di debug.

Tuttavia, se stiamo parlando di sacrificare la leggibilità del codice in termini di velocità di esecuzione del codice, è probabilmente un compromesso accettabile a condizione che il codice debba preformarsi in modo efficiente. Scrivere qualcosa che corre il più velocemente possibile solo perché non puoi non è una buona ragione come perché è qualcosa come la radice quadrata inversa veloce in cui le prestazioni sono la chiave. Il trucco sta nel bilanciare il codice e assicurarsi che, anche se la fonte potrebbe essere difficile da leggere, i commenti che descrivono ciò che spiega spiegano cosa sta succedendo.



2

Non accetto l'argomento "leggibilità sulle prestazioni". Lascia che ti dia una risposta con una diversa rotazione.

Alcuni retroscena: sai cosa mi fa star male? Quando faccio doppio clic su Risorse del computer e devo effettivamente attendere che compaia. Se ciò richiede più di 5 secondi, sono davvero frustrato. La cosa stupida è, e non solo incolpare Microsoft per questo, è che in alcuni casi la ragione per cui ci vuole così tanto tempo è che bisogna prendere una decisione su quale icona mostrare! Giusto. Quindi eccomi qui seduto, interessato solo ad andare sul mio disco C: e devo aspettare che il driver acceda al mio CD-ROM e leggere l'icona da lì (supponendo che ci sia un CD nell'unità).

OK. Quindi, solo per un secondo, immagina tutti i livelli tra di me che fanno doppio clic su Risorse del computer e che in realtà parla tramite driver al CD-ROM. Ora immagina che ogni livello fosse ... più veloce ...

Vedete, dietro tutto ciò ci sono migliaia di programmatori felici perché il loro codice è "più leggibile". È fantastico. Sono felice per te. Ma dal punto di vista dell'utente fa semplicemente schifo (termine tecnico). E così dormi sonoro di notte dicendoti che hai fatto la cosa giusta assicurandoti che il codice sia più leggibile e tuttavia più lento. Anche leggermente più lento di quanto possa essere. E così migliaia di sviluppatori lo fanno e finiamo per aspettare i nostri PC a causa tua. Secondo me non sei degno. Non sto dicendo che le tue prime righe debbano essere le migliori.

Ecco il mio approccio: in primo luogo, farlo funzionare, quindi farlo più veloce. Punta sempre a scrivere un codice efficiente e, se devi sacrificare la leggibilità, integralo con i commenti. Non sacrificherò l'efficienza in modo che un programmatore mediocre possa mantenerla. Spiegherò comunque il mio codice, ma se ciò non bastasse, mi dispiace, sei semplicemente incompetente a lavorare qui. Perché qui, scriviamo codice che è veloce e leggibile, e sebbene ci sia un equilibrio, il codice leggibile può essere spiegato mentre l'inefficienza è semplicemente inaccettabile.


"OK. Quindi, solo per un secondo, immagina tutti i livelli tra di me facendo doppio clic su Risorse del computer e in realtà parla tramite driver al CD-ROM. Ora immagina che ogni livello sia stato ... più veloce ..." istantaneo per me con 2 DVD Drives
Rangoric

Una sola parola: Aggiornamento
jmort253

2
Ragazzi, lavora qui con me, è un'illustrazione ...
Maltrap,

@Rangoric è quello che chiamo usando i progressi della tecnologia come una stampella piuttosto che un regalo. Funziona bene per l'industria se riesci a convincere gli utenti ad aprire i loro portafogli più spesso.
Jonathan Neufeld,

Penso che l'impatto energetico del codice gonfio richieda misure più scrupolose e rigorose. Qui manca la tutela ambientale. Considerando che ora stiamo osservando un aumento di 4 gradi delle temperature globali, perché la complessità computazionale passa in secondo piano?
Jonathan Neufeld,

2

Questa domanda mi è venuta spesso in mente quando si discutono interviste in ufficio. Molti anni fa, come laureato, mi è stata posta la domanda "Pensi che il codice sia auto-documentante?". Ora, dovevo rispondere a questa domanda come programmatore e, per quanto riguarda l'intervistatore, era una domanda in bianco e nero, quindi non c'era via di mezzo. Il processo dovrebbe sopravvivere all'individuo in quanto le persone saranno più che vivaci che andranno e verranno e vorrete preparare i nuovi inizi il più presto possibile, e più facile è leggere il codice, più veloce è capire cosa sta succedendo.

Ho letto un libro un po 'di tempo fa abbastanza buono, chiamato Domain Driven Development: Domain-driven Design: Affrontare la complessità nel cuore del software Certo, all'inizio è un po' secco, ma il materiale è ben presentato. Questo dimostra un buon approccio che porta a sistemi che si documentano bene. La lingua è il mezzo per comunicare la tua soluzione, quindi più chiara è la soluzione, più facile è adattarsi se performace diventa un fattore citico. Questa è la mia convinzione e sembra aver funzionato bene per me.


1

Raramente ne varrebbe la pena il ROI nel rendere il codice più veloce a scapito della leggibilità. I computer moderni funzionano così velocemente che dubito che ci sarebbe uno scenario in cui lo vorresti. Se un computer esegue il codice, è necessario mantenerlo.

A tal fine, trovo la leggibilità molto importante. Naturalmente, come affermato più volte, solo perché il codice è leggibile non significa necessariamente che è più lento.

Un buon esempio è un nome di variabile: $a

Cosa è $a?? Questo è fuori contesto, quindi non puoi rispondere ma ti sei mai imbattuto in questo nel codice reale? Ora supponiamo che qualcuno abbia scritto $file_handle- ora che cos'è? È chiaro anche fuori dal contesto. La lunghezza del nome della variabile fa una differenza insignificante per il computer.

Penso che ci sia buon senso qui.

Alcune applicazioni potrebbero giustificare una scorciatoia di bit-shift che non tutti capiranno, ma penso che ad un certo punto ci siano rendimenti ridotti e trovare uno scenario è raro *.

* questo dipende dall'industria e da altre cose del genere. Sto guardando questo dal punto di vista dello sviluppatore di software aziendale (Business Information Systems).


Per guardare questo da un'altra prospettiva (ma non per divagare), lavoro in un'azienda che fa SAAS. Quando un sito non funziona, dobbiamo risolverlo molto, molto velocemente - di solito qualcun altro sta riparando il codice di un altro sviluppatore.

Mi piacerebbe molto meglio qualcuno fare qualcosa di molto inefficiente, ma leggibile rispetto per renderlo fantasia e "veloce". I nostri server Web sono all'avanguardia e non è necessario consegnare una richiesta in milionesimi di secondo. Non abbiamo problemi di caricamento.

Quindi, in pratica, penso che tu abbia maggiori probabilità di ferire te stesso o gli altri ... (Preferirei che il mio weekend fosse tornato.)


1

Nella maggior parte dei casi, la risposta è "Affidati al tuo compilatore per fare il suo lavoro" e scrivi un codice leggibile. Ciò implica che il codice è strutturato in modo logico (cioè senza spaghetti) e auto-documentato (cioè, nomi sufficientemente chiari di variabili, funzioni, ecc.). Codice del supplemento che non è auto-documentato con commenti significativi. Non commentare per commentare, ad es.

x++; // Add one to x

Piuttosto, commenta per te, lettore, tra 6 o 12 mesi o qualche altro tempo sufficientemente lungo. Adotta uno standard di codifica e seguilo.


+1 per "Fidati del compilatore per fare il suo lavoro". Questo è il mio nuovo commento su Skype.
jmort253

0

Il codice pulito è un codice veloce. Scritto chiaramente, il codice facile da mantenere tende ad essere più veloce perché è un indicatore del fatto che il programmatore ha compreso l'attività a portata di mano e ha riformattato il codice fino al suo scopo principale.

Inoltre, i compilatori moderni ottimizzano le istruzioni in modo molto efficace. Quante righe di codice digitate per fare qualcosa e ciò che il compilatore crea in termini di istruzioni non sono necessariamente correlate. Leggi i compilatori per capire perché è così.

Quando sto lavorando su qualcosa basato sulle prestazioni come la grafica, a volte sacrifico la leggibilità / manutenibilità quando sto facendo cose come l'elaborazione delle immagini quando sto lavorando sugli algoritmi nidificati più profondi in cui le piccole ottimizzazioni possono avere un effetto maggiore. E anche allora lo faccio solo dopo aver profilato per garantire che i cambiamenti accelerino effettivamente le cose. Non posso dirvi quante volte ho provato "ottimizzazioni" codificate a mano solo per scoprire che in realtà ha rallentato l'app a causa del modo in cui il compilatore ha ottimizzato il codice digitato a mano.


-1

La leggibilità è una scusa per programmatori incompetenti e pigri (in realtà lo stesso vale per la "semplicità" se usato come argomento per difendere un algoritmo / design scadente)!

Per ogni dato problema dovresti cercare la soluzione ottimale! Il fatto che oggi i computer siano veloci non è una scusa per sprecare i cicli della CPU. L'unico vincolo dovrebbe essere il "tempo di consegnare". Nota che "soluzione ottimale" qui significa quella che TU puoi trovare (non tutti possiamo trovare la soluzione migliore o avere le abilità / conoscenze per implementarle).

Come ha detto qualcun altro se ci sono aspetti "difficili da capire" di una soluzione, questo è ciò che serve ai commenti. L'ordine "corretto, leggibile, veloce" (o qualcosa del genere), che qualcun altro ha citato è solo una perdita di tempo.

Ho davvero difficoltà a credere che ci siano programmatori là fuori, che quando si presentano con un problema pensano nelle righe "... questo deve essere fatto in questo modo, ma farò in questo modo che è meno efficiente ma più leggibile / manutenibile e altre simili cazzate ... ". L'errore di questo è che il prossimo sviluppatore (vedendo le inefficienze) molto probabilmente modificherà il codice e il prossimo farà lo stesso e così via ... Il risultato finale è che dopo alcune versioni il codice diventerà quello che l'originale lo sviluppatore avrebbe dovuto scrivere al 1 ° posto. L'unica scusa per lo sviluppatore originale è a. non ci pensava (abbastanza onesto) e (come detto prima) b. vincoli di tempo e risorse.


-2

se ridurre la leggibilità aiuta le prestazioni / l'ottimizzazione del codice (come nelle librerie swfobject e altre js) è un motivo solo per continuare a scrivere codice ben formato e chiaramente leggibile e convertirlo in illeggibile / ottimizzato come parte del processo di "compilazione" / rilascio.

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.