Codici (semplicissimi)uguali, oneri computazionali diversi??

raff5184
ciao ho due codici matlab uguali ma che vengono eseguiti con tempi differenti e non riesco a capire perché:



    
nRuns = 1000;
tmax = 100;
lambda = .1;
count =0;
for i = 1: nRuns
    clc
    i
    tk = exprnd(1/lambda);
    while (tk < tmax)
        count=count+1;
        tk=tk+exprnd(lambda);
    end
end


l'altro, che è anche più complicato, moltiplica per 10 volte le istruzioni del precedente ma è di gran lunga più efficiente



lambda=0.1;
tmax=100;
nruns=10000;
Ntot=0;
ttot=0;
for runs=1:nruns
    clc
    runs
    N=0;    
    t=0;
    while(t<tmax)
        t=t+exprnd(1/lambda);
        %t=t-log(rand(1,1))/lambda;
        N=N+1;
    end
   
%...
%altre operazioni con i valori trovati
%...
end

Risposte
giozh
ora a prescindere che di matlab ci capisco poco e niente, i tempi di esecuzione così a prima vista mi sembrano O(n^2) (per i due cicli uno dentro l'altro) entrambe. sicuro che i due while terminino nello stesso momento (a parità di istruzioni eseguite)?

Rggb1
Anche io non conosco il linguaggio, però...
ciao ho due codici matlab uguali ma che vengono eseguiti con tempi differenti e non riesco a capire perché:

sono uguali? Se intendi "fanno gli stessi calcoli" noto che nel ciclo while del primo listato c'è
        tk=tk+exprnd(lambda);

mentre nel secondo c'è
        t=t+exprnd(1/lambda);

e non mi sembrano lo stesso calcolo.

Danel1
Ciao, infatti non si possono dire che sono uguali cosi come il fatto che abbiano stesso costo computazionale (che è comunque un'indicazione asintotica di come cresce il tempo computazione al crescere di N) non significa che debbano impiegare lo stesso tempo. Ci sono operazioni svolte più velocemente dal processore, altre che risultano più veloci, ma occupano più memoria ecc.

Al di là di possibili ottimizzazioni che è in grado di fare matlab (che conosco molto poco) è probabile che le istruzioni nel ciclo del secondo listato permettano di fare meno operazioni del primo (controlla bene perchè le istruzioni sono profondamente diverse oltre ad una differenza nel secondo compare anche un log che nel primo non c'è).

giozh
Ciao, infatti non si possono dire che sono uguali cosi come il fatto che abbiano stesso costo computazionale (che è comunque un'indicazione asintotica) non significa che debbano impiegare lo stesso tempo.

oh yes, va tenuto conto anche di questo, ma in linea di principio il costo nel caso peggiore di entrambe dovrebbe essere quello che ho scritto sopra. e poi che significa che sono eseguiti in tempi differenti? in che modo hai misurato i tempi di esecuzione?

Umby2
In entrambi codici noto che hai utilizzato un contatore (Count , N). Hai provato a visualizzare a fine ciclo il contatore ?
Cosi' facendo ti puoi rendere conto se effettivamente i due cicli sono o meno uguali.

Danel1
Non vorrei dire anche qualche stupidaggine non conoscendo matlab, nè avendo ben chiaro lo scopo del sorgente, ma stai comunque utilizzando funzioni che generano numeri pseudocasuali e che vanno ad influenzare le variabili utilizzate come condizione per i cicli while. Bisognerebbe verificare che il secondo richieda sistematicamente meno tempo o che in realtà sia frutto del caso ( o dello pseudo-caso).

Condivido il consiglio di Umby, fai varie prove e verifica il valore dei contatori. Considerando le funzioni usate, credo, ma mi potrei sbagliare, che non sempre siano uguali (probabilmente quasi mai)

raff5184
"Rggb":
Anche io non conosco il linguaggio, però...
ciao ho due codici matlab uguali ma che vengono eseguiti con tempi differenti e non riesco a capire perché:

sono uguali? Se intendi "fanno gli stessi calcoli" noto che nel ciclo while del primo listato c'è
        tk=tk+exprnd(lambda);

mentre nel secondo c'è
        t=t+exprnd(1/lambda);

e non mi sembrano lo stesso calcolo.

:oops: non me ne ero accorto. Grazie :)

raff5184
"giozh":
Ciao, infatti non si possono dire che sono uguali cosi come il fatto che abbiano stesso costo computazionale (che è comunque un'indicazione asintotica) non significa che debbano impiegare lo stesso tempo.

oh yes, va tenuto conto anche di questo, ma in linea di principio il costo nel caso peggiore di entrambe dovrebbe essere quello che ho scritto sopra. e poi che significa che sono eseguiti in tempi differenti? in che modo hai misurato i tempi di esecuzione?
stampando a video l'induce di ogni iterazione del while

giozh
beh ma questo non è sufficiente (in linea di principio) a stabilire qual'è il codice migliore , perche come già hanno scritto, durante la reale esecuzione di un sorgente entrano in ballo molteplici fattori che dipendono dallo stato del processore e dai processi attivi in quel momento

raff5184
si certo, è giusto, ma in questo caso era questo il problema, in quanto ci sono 2 codici identici ma che vengono portati a termine in tempi estremamente diversi

Rggb1
Tutto giusto, però... La domanda era: il codice A è praticamente identico al codice B, ma B è [molto] più veloce di A, come è possibile?
Risposta: il codice A non è identico al codice B, ovvero i due cicli non eseguono le stesse operazioni.
Quindi non c'è da cercare efficienza di compilazione, operazioni fatte prima/dopo, situazioni mutate nel tempo ecc.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.