Newsgroup: it.comp.lang.visual-basic
Titolo: velocità Select Case

Salve a tutti.
Mi chiedo quale tra i due seguenti blocchi di codice è più veloce
nell'esecuzione:
    <primo blocco>
    Select Case listinoselezionato
        Case 1
            rsSQL = Replace(rsSQL, "ppppp", "ART_PREZZO1")
            rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO1_1")
            rsSQL = Replace(rsSQL, "sssss2", "ART_SCONTO1_2")
        Case 2
            rsSQL = Replace(rsSQL, "ppppp", "ART_PREZZO2")
            rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO2_1")
            rsSQL = Replace(rsSQL, "sssss2", "ART_SCONTO2_2")
        Case 3
            rsSQL = Replace(rsSQL, "ppppp", "ART_PREZZO3")
            rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO3_1")
            rsSQL = Replace(rsSQL, "sssss2", "ART_SCONTO3_2")
        Case 4
            rsSQL = Replace(rsSQL, "ppppp", "ART_PREZZO4")
            rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO4_1")
            rsSQL = Replace(rsSQL, "sssss2", "ART_SCONTO4_2")
    End Select
    <secondo blocco>
    rsSQL = Replace(rsSQL, "ppppp", Choose(listinoselezionato, "ART_PREZZO1",
"ART_PREZZO2", "ART_PREZZO3", "ART_PREZZO4"))
    rsSQL = Replace(rsSQL, "sssss1", Choose(listinoselezionato, "ART_SCONTO1_1",
"ART_SCONTO2_1", "ART_SCONTO3_1", "ART_SCONTO4_1"))
    rsSQL = Replace(rsSQL, "sssss2", Choose(listinoselezionato, "ART_SCONTO1_2",
"ART_SCONTO2_2", "ART_SCONTO3_2", "ART_SCONTO4_2"))
Indubbiamente il secondo blocco è più compatto e il primo è un po' più
leggibile, ma mi chiedevo quale dei due avesse la maggiore velocità di
esecuzione.
Leggerò attentamente il parere di chiunque. Ciao a tutti.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

[yronium]
[SNIP]
E' piu' veloce il primo blocco (Select Case), per quanto certe 
ottimizzazioni hanno senso solo se le operazioni che evidenzi sono ripetute 
migliaia di volte.
Io comunque scriverei un ancora piu' compatto:
rsSQL = Replace(rsSQL, "ppppp", "ART_PREZZO" & CStr(listino))
rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO" & CStr(listino) & "_1")
rsSQL = Replace(rsSQL, "sssss1", "ART_SCONTO" & CStr(listino) & "_2")
hth,
Lokar 

 Leggerò attentamente il parere di chiunque. Ciao a tutti.
E' noto che il Select Case è più lento dell'uso di IF...Then Elseif End
pertanto potresti usare quello, in ogni caso la 1° dovrebbe
essere più performante, in particolare se i Case seguono la sequenza
di probabilità di uscita danno risultati più ottimali.
Avevo un Demo, ma in Access come ben sai, che dimostrava la
differenza di velocità tra un Select Case ed in controllo IF su
100000 iterazioni, e la differenza era evidente.
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 100000 iterazioni, e la differenza era evidente.
Infatti, sapevo anch'io che il Select era più lento dell'If, ma non ho la
possibilità di misurare la velocità dell'istruzione con Choose. E purtroppo
non c'è neanche una prevalenza di probabilità tra i valori di listino, per
cui non serve nemmeno posizionarne qualcuno più in alto.
Comunque mi pare di capire che il Choose abbia un po' più di ritardo, e
istintivamente sembrerebbe anche a me, soltanto che con i miei dati di
esempio non rilevo differenze riscontrabili, anzi a volte Choose sembrerebbe
leggermente più veloce.
Per fare le cose fatte bene, ci vorrebbe un benchmark. Su un Balena da 10.70
Euro c'è un test con delle API, ma non sono mai riuscito a farlo girare sul
mio sistema, forse perché utilizzo W98se.
Questa è la prima volta che mi scranio su una questione di prestazioni, ma
in qs. routine devo aprire un recordset in rete che può avere uno o cento
record, e poi riempire una FlexGrid, per cui devo stare attento a tutti gli
accorgimenti.
Grazie per le risposte.


Nel mio sitop trovi una Classe(nella sezione Classi) che realizza un
test di performances fatto
con le API, è preciso al ms, eventualmente c'è un Demo sempre in
Access
che mostra alcune differenze, non ricordo se il DEMO è nella sezione
Forms o altro, eventualmente
dai un'occhiata, il link dovresti trovarlo eventualmente se ti serve te
lo ridò.
Una domanda, il DB è Access o SQL_SERVER...?
Nel 2° caso non potresti realizzare una SP e fare elaborare lato
server la cosa...?
In questo caso occorre però valutare se conviene far impazzire il
Server o
se è meglio far lavorare il Client...!
@Alex

 se è meglio far lavorare il Client...!
Il db è SQLServer, anzi MSDE. Il problema è che è la prima volte che ci
lavoro, e non ho alcuna conoscenza delle sp. Inoltre il db esiste già e non
lo amministro io, e non so se inserire una sp necessiti di una modifica del
db, nel qual caso io non la posso fare. Certo, in termini di mere
prestazioni sarebbe meglio far scervellare il server, che di solito è più
veloce, ma chissà se è vero nel nostro caso...
Beh tra mezz'ora provo il tuo benchmark. Ciao.


 Per fare le cose fatte bene, ci vorrebbe un benchmark.
Per fare le cose fatte bene bisognerebbe evitare di scrivere codice 
immantenibile come quello.
Sarebbe il caso di puntare sulla leggibilità piuttosto che sul millisecondo.
Ciao 

 Sarebbe il caso di puntare sulla leggibilità piuttosto che sul
millisecondo.
Perché immantenibile, Zanna? Sai che tengo nella massima considerazione i
tuoi commenti. Quale strada sceglieresti o cosa migliorereresti tu?



Perchè le liste di if e select sono solitamente una cattiva strada, in 
particolare quando il problema si può facilmente normalizzare come indicato 
da Lokar.
Ciao 

 Beh tra mezz'ora provo il tuo benchmark. Ciao.
Ciao



Non riesco a navigare nel sito (forse mi manca Macromedia),
c'è un link diretto per queste due cose da scaricare ?

 1.18 Timer preciso al msec per calcolo prestazioni
Allora, risultato finale. Nella finestra Immediata ho i seguenti risultati:
 6,45334316699911E-02 con Select Case
 4,19048257597345E-02 con Choose
Ebbene si, contrariamente a quello che pensavo ma esattamente come mi aveva
dato l'impressione, il metodo con Choose è più veloce, oltre che più
compatto.
Il test è stato eseguito con la classe Calcolo Prestazioni di Alessandro, e
sebbene non abbia capito quale soluzione avrebbe scelto Zanna, io opterò per
il Choose.
Grazie ad Alessandro, e grazie a tutti per l'attenzione.
PS. Per Lokar, questa ottimizzazione ha senso. Questa routine carica le
righe dei documenti, e qualche documento può avere anche duecento righe. Il
numero non è di per sé elevato, ma il riempimento della FlexGrid lo è, per
cui devo ridurre i tempi da qualche parte. Senza contare che in teoria
potrei anche avere un numero di righe maggiore (una volta ho visto una
fattura di diciotto pagine!!).


 4,19048257597345E-02 con Choose
Un momento, mi correggo: 3,18476675773982E-02 con Replace, come aveva
suggerito Lokar, cioè il doppio di velocità del Select Case.
Scusa, Lokar, avevo dato importanza al discorso sulla necessità di
ottimizzazione, ma non avevo considerato l'esempio di codice, l'ho riletto
adesso e l'ho provato subito. Certo, che scemo che sono, è ovvio che così è
più veloce, non deve scegliere i valori. Si vede che a qs. progetto ci
lavoro prevalentemente di notte...


 c'è un link diretto per queste due cose da scaricare ?
Boh..!
La gestione della navigazione è fatta con un controllo
Macromedia(DW), ma non credo dipenda dal fatto che non l'hai.
Nemmeno io l'ho installato al lavoro ma navigo regolarmente.
Nel sito in questione però c'è prettamente materiale
per sviluppatori di Access_VBA, non sò se può essere
utile per VB.
Saluti


Se hai usato delle API (che sono uguali per tutti, giusto?...)
mi interessa dare una occhiata alla tecnica,
se tali due file sono in qualche modo reperibili

Allora, risultato finale. 
scusa, hai per caso
i link diretti ai due file ?

 se tali due file sono in qualche modo reperibili
In questo caso la classe è usabile anche in VB senza problemi, ma
spesso non è come dici, in VBA non ci sono tutte le possibilità di VB
quindi si deve ricorrere a qualche manciata di API supplementare
che spesso rompe le scatole.
http://www.mantuanet.it/alessandro.baraldi/FilesEsempio/CLASSES/clsPerformanceTime.cls
Prova con il Link completo.
Ciao
