Ottimizzazione codice: moltiplicazione con 1

di il
6 risposte

Ottimizzazione codice: moltiplicazione con 1

Ciao,

vorrei chiedervi un'opinione in merito alla performance di codice. Secondo voi, quale dei seguenti codici è più veloce e quindi da preferire?

#1
ratio := A/B;
if A <> B then
   var2 := 100 + var1 * ratio
else
   var2 := 100 + var1;      //ratio = 1
#2
ratio := A/B;
var2 := 100 + var1 * ratio;
Di questi calcoli devo fare circa mille per ogni pagina processata. Quindi, anche minime differenze tra le due alternative avrebbero un effetto se il file è composto da decine o centinaia di pagine.

Ale

6 Risposte

  • Re: Ottimizzazione codice: moltiplicazione con 1

    al.delphi ha scritto:


    Secondo voi, quale dei seguenti codici è più veloce e quindi da preferire?
    [...]
    anche minime differenze tra le due alternative avrebbero un effetto se il file è composto da decine o centinaia di pagine.
    Secondo me, con un moderno processore anche "entry level", qualunque scelta tu faccia soprattutto se riferita a un linguaggio compilato e performante quale è Delphi, non noterai assolutamente la differenza.

    Io ti suggerirei di scegliere il codice più leggibile.

    In alternativa, valuta un benchmarking usando i tool appositi, tipo "Performance Counters", così sei sicuro della scelta.

    Magari approfondirei la possibilità di parallelizzare le operazioni sfruttando il multithreading ed elaborando più pagine alla volta, quello sì.

    Ciao!
  • Re: Ottimizzazione codice: moltiplicazione con 1

    Cerco subito.

    Grazie! : )
  • Re: Ottimizzazione codice: moltiplicazione con 1

    Ciao Marco,

    le pagine vengono processati in parallelo. Ho inserito un "Now" all'inizio e uno alla fine del processo e misurato la differenza in millisecondi. Processando due pagine (ciascuna 5 volte per calcolare una media) in entrambi i modi (code #1 e code #2) risulta:

    code#1 pag1 caso "ratio <> 1" = 355,2 ms; caso "ratio = 1" = 299,4 ms
    code#2 pag1 caso "ratio <> 1" = 333 ms; caso "ratio = 1" = 262,2 ms

    code#1 pag2 caso "ratio <> 1" = 805,4 ms; caso "ratio = 1" = 723,4 ms
    code#2 pag2 caso "ratio <> 1" = 724,4 ms; caso "ratio = 1" = 646,4 ms

    Anche se questi valori sono altamente approssimativi risulta che il codice #2 è da preferire in tutti i casi con un risparmio di tempo fino addirittura il 10%.

    Grazie per il suggerimento. Non ci avevo pensato di fare del benchmarking di porzioni di codice. È perfetto! Lo loggo subito. : )

    Ale
  • Re: Ottimizzazione codice: moltiplicazione con 1

    Esegui due comandi (di cui if corrisponde a due comandi per via del controllo a<>b) e occupi memoria con le variabili
    if B<>0 then var2 := 100 + (var1 * A/B);

    in questo caso esegui un comando (e un controllo) e non usi variabili (ratio)
    io eliminerei anche var1 e var2...
  • Re: Ottimizzazione codice: moltiplicazione con 1

    ATTENTO a ragionare in questi termini. E' il classico errore dei neofiti

    Nel 99.9999% dei casi, l'ottimizzazione del codice NON SI TROVA dove tu pensi sia!

    Tu hai ""ottimizzato"" (per modo di dire), giusto UNA LINEA di code, SENZA prendere in considerazioen DOVE questa linea si trova e TUTTO QUELLO CHE STA' ATTORNO.

    Questo per dire che magari ai migliorato le performa del 10% MA il codice eseguito rappresenta SOLO l'1% DEL TEMPO USATO da tutto quello che sta' attorno. Risultato EFFETTIVO, hai migliorato la tua applicazione del 0.1%.
    MAGARI ci sono altre parti di codice che, ""opportunamente riorganizzate"" ti migliorano le performace generali del 20/30% !

    20/30% rispetto a 0.1% vuol dire fare di meglio 2000/3000 volte!
  • Re: Ottimizzazione codice: moltiplicazione con 1

    In base ai dati suppongo sia scritto in un ciclo while o repeat...
    ma se gia' in questa riga elementare si usano 4 variabili e due righe di codice significa che a monte c'e':
    var1:='valore'
    var2:='altro valore'
    ratio:= var1/var2
    quando basterebbe ratio:=val1/val2 e in ogno caso anche ratio potrebbe essere superfluo, come nel caso riportato.
    con le var quindi nel ciclo va inserita anche l'assegnazione delle variabili, cosa del tutto superflua perche' si puo' usare direttamente il valore senza farlo passare dalle variabili.
    tuttavia ha postato solo due righe...
    stendo un velo sul titolo: "moltiplicazione per 1" poiche' n*1=n e a/b con b<>0 puo' dare anche 1 non serve che a<>b ma che b<>0 per non generare errori tipo EDivByZero
Devi accedere o registrarti per scrivere nel forum
6 risposte