Codici (semplicissimi)uguali, oneri computazionali diversi??
ciao ho due codici matlab uguali ma che vengono eseguiti con tempi differenti e non riesco a capire perché:
l'altro, che è anche più complicato, moltiplica per 10 volte le istruzioni del precedente ma è di gran lunga più efficiente
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
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)?
Anche io non conosco il linguaggio, però...
sono uguali? Se intendi "fanno gli stessi calcoli" noto che nel ciclo while del primo listato c'è
mentre nel secondo c'è
e non mi sembrano lo stesso calcolo.
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.
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'è).
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'è).
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?
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.
Cosi' facendo ti puoi rendere conto se effettivamente i due cicli sono o meno uguali.
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)
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)
"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.


"giozh":stampando a video l'induce di ogni iterazione del whileCiao, 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?
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
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
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.
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.