Newsgroup: it.comp.lang.visual-basic
Titolo: [!]Pari e Dispari - Modulo vs Divisione

Ho fatto alcuni test e mi sono accorto che fra:
1)
    If ((N Mod 2) = 0) Then
        'Qualunque cosa
    End If
2)
    If ((N / 2) = (N \ 2)) Then
        'Qualunque cosa
    End If
E' piu' performante la 1. Commenti? =)
Lokar, sintetico.
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt


Mi piacerebbe sapere quanto è più performante .. comunque ..
è più facile fare una sola operazione nativa (Mod) piuttosto che 2
(divisione in decimale e in intero) ... tu cosa ne pensi ?
    Saluti

     End If
Bč... la prima alla fin fine esegue una divisione e un confronto mentre la
seconda esegue 2 divisioni ed un confronto. Credo dipenda da questo.
CiaoZ
SebaMix


forse perche' nel secondo caso devi eseguire due operazioni ed una
comparazione, mentre nel primo solo un operazione e poi una comparazione ?
AnTor

 E' piu' performante la 1. Commenti? =)
Nessuno. Perche' *tutti* sappiamo che non si deve ottimizzare il codice ma
scrivere codice ottimizzato. Che stress!... :)
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 E' piu' performante la 1. Commenti? =)
3)
     ' con n intero
     If ((N And 1) <> 0) Then
         'Qualunque cosa
     End If
Ciao

 ha scritto nel messaggio
news:PkHJ8.79$Hf1....@nreader2.kpnqwest.net...


     End If
Non ci avevo pensato! E' il tipo di risposta che mi aspettavo (dal tipo
di persona che mi aspettavo ;)).
L'And binario e' poco piu' performante del modulo. In ogni caso (come
hai specificato) si puo' usare solo fra numeri interi.
Ancora commenti? Metodi migliori? =)
Lokar, venghino signori venghino!


 siffatta?
No. .Net non ammette conversioni implicite, che fra l'altro sono causa di
tanti fraintendimenti e bug degli applicativi scritti in VB. Basti pensare a
quanta gente usa .Caption=Numero, o addirittura crea stringhe Sql con "Where
campo=" & Booleano, poi si lamenta perchè non va.......
Come te, anche io evito le conversioni implicite. Meglio scrivere due
lettere in più qua e là, ma avere un codice molto più portabile e rigoroso.
Nel caso in particolare, effettivamente Cbool(N Mod 2) risolve bene la cosa.
Molto bella anche la soluzione con l'AND. Ovviamente è applicabile solo ad
interi, ma del resto con i decimali che senso ha parlare di pari o dispari?
Ciao
Alberto

 hai specificato) si puo' usare solo fra numeri interi.
Beh, d'altra parte non ha molto senso dire che 2.7589 è pari (o dispari).
Eventualmente basta un
((Fix(N) And 1) <> 0)
Ciao

 divisione (fra interi e non).
Non sono d'accordo!
Per esempio su un'architettura vecchia (Motorola 68000) il mod lo si
otteneva nella parte alta di un registro facendo la divisione del registro
stesso per una costante od un altro registro.
Quindi in questo caso il tempo fra un mod ed una divisione (fra numeri
interi) era lo stesso.
Rimane migliore la soluzione (N and 1) che su qualunque architettura prende
il numero minimo di cicli macchina (a livello hardware gli operatori logici
sui registri sono la cosa più naturale, anzi i processori funzionano solo
come insieme di operatori logici in successione e/o in parallelo).
Altre soluzioni in assembler 68K (è l'unico che ricorda a memoria):
btst.l #0,D0   ' supponendo che il registro D0 contenga l'intero N, viene
testato il bit 0, ovvero il bit della parità.
oppure, si shifta il registro di un bit a destra e si verifica che il flag
del carry sia =0, vale a dire se è stato "perso" un uno oppure uno zero
Saluti,
Luca Barbetta kck/skd

[Luca Barbetta]
[SNIP]
Veramente interessante (anche se VB c'entra poco o niente ;)).
Happy Coding =)
Lokar

 Ancora commenti? Metodi migliori? =)
--
