Domanda

Un peer di mine sta lavorando ad un report che visualizza il settimanale (Domenica a Sabato) prima di ogni dipendente nel nostro piccolo studio di consulenza. C'è un pezzo di codice che ha scritto che mostra le colonne corrispondenti ai giorni della settimana di destinazione. Il suo algoritmo è il seguente:

  1. Get quale giorno della settimana il primo giorno del mese è. Se si tratta di Domenica, impostare un flag a zero; in caso contrario, impostarla su uno.
  2. Scorrere tutti i giorni della mese. Se si tratta di Domenica, incrementare la bandiera. Poi, se il valore del flag è uguale alla settimana da visualizzare, mostrare la colonna corrispondente al giorno corrente; altrimenti, nascondere la colonna.

Naturalmente, la bandiera indica ciò che la settimana corrente è.

ho suggerito un altro algoritmo:

  1. Ricevi quali giorni del mese sono la prima (F) e l'ultimo (L) giorni della settimana specificato. Per esempio, la prima settimana di ottobre 2009 inizia il 1 ° Martedì e termina il Sabato 3.
  2. Scorrere le colonne corrispondenti ai giorni 1 a F-1, e nasconderli.
  3. Scorrere le colonne corrispondenti ai giorni F a L, e mostrare loro.
  4. iterazioni sulle colonne corrispondenti ai giorni L + 1 a DaysOfMonth, e nasconderli.

La parte "difficile" nel mio algoritmo è parte 1. Voglio dire "difficile" come in "difficile da capire", perché la complessità algoritmica di farlo è costante. E il mio algoritmo ha il vantaggio di avere ciclo stretto. ciclo di mio pari fa un confronto per tutti i giorni del mese. La mia non lo fa.

Questo è un piccolo esempio e si potrebbe dire che l'eccesso di ottimizzazione qui è un po 'troppo paranoico. Ma il suo stile di programmazione non cambia un po 'quando si scrive codice vero e proprio spettacolo-critical.

Il suo codice è anche piena di questi test:

/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
    flag++;
    if (flag > test)
        doSomething();
}
else
    if (flag >= test)
        doSomething();

Quando, naturalmente, si può fare in questo modo:

if (flag >= test);
    doSomething();
if (condition)
    flag++;

Che cosa devo fare?!?!?!

EDIT:. Ho corretto i confronti negli esempi di codice

È stato utile?

Soluzione

E 'questo il vostro compito, o il suo? Se il suo il suo, lo faccia. Sono una persona che vive di efficienza, in effetti divento molto frustrato quando qualcosa sembra inefficiente ed è fuori dal mio controllo.

Ci sono oltre 200 persone su così che potrebbe mettere le mie piu 'efficienti' idee, algoritmi e codice per la vergogna. Probabilmente più, non si può andare da Rep solo. Se Linus Torvalds stesso firmato, avrebbe cominciato a 1, come il resto di noi.

Quello che devi considerare è che la gente ha bisogno di essere in grado di mantenere il codice che scrivono. Questo significa, devono capire come se hanno dato alla luce ad esso. Anche se qualcuno ha dimostrato un altro algoritmo come molto più efficiente della mia, io non lo uso se non ero confortevole con esso.

Se questo è un progetto congiunto, scrivere il vostro senso, dimostrare la velocità e poi trascorrere qualche ora molto, molto paziente con il peer to aiutarlo davvero afferrarlo.

guardare indietro su cose che hai scritto 5 anni fa, tutti deve imparare facendo e ognuno fa cose alla loro velocità, in particolare l'apprendimento.

Altri suggerimenti

Penso che il tuo amico ha l'idea giusta. Prendere l'algoritmo che è ovviamente corretta sopra l'algoritmo che avrebbe preso un'ora per spiegare, ma, senza alcun obiettivo particolare prestazioni in mente, è più veloce.

Se si dispone di un requisito specifico delle prestazioni, come 'il codice deve essere in grado di dare risultati corretti per tutti i mesi nei prossimi dieci anni, a meno di 200 microsecondi sulla macchina di X', e il codice più semplice fallisce il requisito, allora si potrebbe considerare l'utilizzo la versione.

(L'esempio di codice che hai postato è davvero ovviamente meglio nel vostro senso, perché è meno complicata.)

Dalla tua descrizione, non sono sicuro che sono in disaccordo con il suo collega. La questione chiave è se questo pezzo di codice è un collo di bottiglia .

Per convincere me per passare al vostro algoritmo che avrebbe dovuto profilo l'applicazione in questione e mi mostra che questo pezzo di codice è la performance-critical. Poi fare le modifiche e profilo di nuovo. In questo modo si dispone di un base oggettiva per il confronto .

Se c'è una differenza significativa tra i due algoritmi poi i due di voi può discutere se o non vale la pena di effettuare il passaggio.

Se siete preoccupati per i tempi di caricamento delle pagine di un'applicazione web, ricordare le lezioni di ad alte prestazioni siti web e le href="http://developer.yahoo.com/performance/" rel="nofollow noreferrer"> linee guida di performance -. come gestire i CSS, JavaScript e il caching avrà un impatto molto più grande di ottimizzare gli algoritmi che vengono eseguiti sul server

Promuovere l'ottimizzazione senza misura è altrettanto pericoloso come ignorare le implicazioni sulle prestazioni di algoritmi ingenui.

Beh, non dovrebbe interferire perché, ovviamente, ti sbagli ... I due pezzi di codice non sono equivalenti. Basta prendere condizione = 1, flag = 0 e test = 1

non vedo il problema qui ... anche se la sua versione ha un po 'modo indiretto di arrivare alla meta, lo fa arrivare lì.

Questa affermazione che sto per dire che non dovrebbe essere presa fuori dal contesto: ma ci saranno sempre persone che lo fanno così - e che non è sbagliato, tutto il contrario ... che forse non conosce un buon modo per fare qualcosa, ma lui non sa come ottenere il risultato, non importa quanto brutto il suo metodo è.
Che può essere un vero e proprio salvagente quando nessuno conosce l'algoritmo corretto per qualcosa ... è probabile che sarà lui a anatra nastro adesivo in qualche modo.

Sono d'accordo con il sentimento prevalente qui: se un miglioramento delle prestazioni sarebbe rendere il codice molto più difficile da leggere, se ci fosse meglio che sia un buon motivo per fare questo cambiamento

.

D'altra parte, ciò non significa che si debba sempre accontentarsi di la prima cosa che viene in mente . A volte ci sono alternative in modo inequivocabile superiori che sono ugualmente leggibili o quasi.

Se si vuole convincere il suo collega di prendere la sua scelta di algoritmi sul serio, si dovrebbe scegliere con attenzione le tue battaglie. Non cercare di trasformare il suo mondo a testa in giù e forzare la questione su ogni singolo caso a trovare. Inizia facendo i vostri suggerimenti solo quando si può pensare di un algoritmo di sostituzione che è palesemente superiore e anche chiaro, ed essere pronti a fare marcia indietro se lui resiste.

Se ti senti subdola, si potrebbe anche dargli suggerimenti, porre domande tendenziose, o qualunque altra tecnica che si può pensare di aiutarlo a capirlo da solo.

Mi sento il vostro dolore. I programmatori sono davvero stubburn in natura. Ognuno ha i suoi propri principi e regole di costruzione dei programmi. Se altre opinioni si scontrano con un po 'di allora, cambiando parere del programmatore è come muoversi pilastri fondamento del grattacielo un edificio. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top