Newsgroup: it.comp.lang.visual-basic
Titolo: Short boolean evaluation in VB5

Ecco i termini del problema :mettiamo caso che VB5 debba valutare una cosa
del genere (essendo M(10,10) e X=0 )
If (X > 0) And (M(X - 1, Y) <> 1) Then...
Ebbene l' interprete di VB5 (perche' e',o non e' ,un interprete che
controlla ogni
espressione in esecuzione ?) genera l' errore di indice nella
matrice M perche' ha valutato anche la seconda parte dell' espressione
booleana, anche
se l'espressione era gia' falsa per la prima parte (cosa che non
avverrebbe in C)
Ora cosa dite, sono costretto a cambiare una valutazione siffatta con:
if (X>0) then if (M(X-1,Y)<>1) then...(cosa che credo non ottimizzi il
codice )
oppure c'e' qualche impostazione di VB5 che consenta la valutazione corta
delle espressioni booleane (impostazione che c'era invece nel buon vecchio
Turbo Pascal che e' pero' un compilatore)
Vi ringrazio e spero di essermi fatto capire
Ettore Pirro

 Ettore Pirro
Ciao
Ven

 codice )
Un costrutto:
If A and B and C then
end if
è molto più lento di:
If A then
    if B then
        if C then
        end if
    end if
end if
Quindi se mi parli di ottimizzare per rendere il codice più leggibile allora
hai ragione.
Se, invece, vuoi ottimizzare la velocità di esecuzione allora, nei casi
possibili, scordati gli And,Or,Xor etc..
Ciao
Daniele
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------


Non ho mai fatto benchmark sull'argomento, ma ti credo.
Aggiungo pero' che questo e' vero in VB, ma non e' vero per altri linguaggi
di programmazione (anzi, direi che VB e' un'eccezione anche in questo caso).
--
Roal Zanazzi
z...@iol.it

 Non ho mai fatto benchmark sull'argomento, ma ti credo.
Non preoccuparti, questa è una certezza. Non ho fatto benchmark neanche io,
ma in una chiamata così:
if ResultA and ResultBand ResultC then
    .....
end if
dove resultA, ResultB e ResultC sono funzioni, se provi ad andare avanti con
il debug un'istruzione alla volta, noterai che quando arriva all'istruzione
if .....  inizia eseguendo la funzione resulA. Se la funzione gli
restutuisce False, Che fà intelligentemente il VB? Continua eseguendo
ResultB e poi ResultC. A quel punti da vero geniaccio si rende conto che la
condizione è falsa. Questo è sempre bene tenerlo a mente perchè se resultA è
così
private Function ResultA () as boolean
    if Divisore=0 then resultA=False else ResultA=true
end function
e resultB è in questo modo:
private Function ResultB() as boolean
    if Dividendo/Divisore>=1 then ResultB=true else ResultB=false
end function
Si può pensare che ResultA eviti l'eccezione della divisione per 0. E invece
no perchè il VB continua l'esecuzione!
VByez!
Cornova


Fermo!
Questo non e' un problema di ottimizzazione di calcolo delle
espressioni  booleane ma e' una ben precisa scelta implementativa (
discutibile quanto si vuole pero' ) e' il C che prevede espressamente il
'taglio' delle espressioni booleane ( ovvero il sospendere il calcolo
della stessa nel momento che arriva ad un risultato definitivo ). tieni
conto che in tutti e due i casi ci sono o ci possono essere effetti
collaterali dovuti al calcolo o al non calcolo di funzioni.
L'unica cosa importante e' tenere a mente il comportamento del VB e non
cadere in questi errori.
Tieni conto che se l'espressione e' molto complessa ( piu' and e or
insieme) per una persona puo' essere molto difficile quando il calcolo
della espressione si blocca.