Newsgroup: it.comp.lang.visual-basic
Titolo: Confronto prestazioni tra costrutti equivalenti

<SegaMentale>
A livello di prestazioni, e' piu' efficente una struttura
if...elseif...elseif...endif o una select case...end select?
Esempio:
Primo caso:
if a = iValore1 then...
elseif a = iValore2 then ...
elseif a = iValore3 then ...
elseif...
else ...
end if
Secondo caso:
Select Case a
  case iValore1
  case iValore2
  case iValore3
...
  case else
end select
Grazie a tutti
Bye by SixaM 8-]
<\SegaMentale>
P.S. Non c'e' in giro una qualche raccolta di Tip x migliorare le
prestazioni degli applicativi? Tipo "usare 'if Len(<stringa>) = 0' al
posto di 'if Stringa = ""'...

 posto di 'if Stringa = ""'...
Tempo fà mi era passato per le mani un libricino in cui si parlava di
ottimizzazioni.
Ma se Googli sicuramente qualcosa la trovi.
--
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 Ciao Fede
Bye by SixaM 8-]

 posto di 'if Stringa = ""'...
Ti posso dire che se è per curiosità va bene. Ma se lo fai per velocizzare
l'applicativo fai molto più sistemando le query varie e le elaborazioni
pesanti.
Se devo valutare un espressione uso il Select Case, è fatto apposta, è più
leggibile.
Se devo valutare varie espressioni uso l'if es.
if false then
  elseif a=1 then
  elseif b=1 then
  elseif c=1 then
endif
Nota l'If False che è un controllo superfluo, ma lo metto per indentare
meglio il codice.

 utilizzando la struttura If ... End If.
Mah, a me non risulta che sia _sempre_ così, anzi...
Se hai una cosa del tipo
Select Case MyHeavyFunction(x)
Case val1
Case val2
Case val3
...
End Select
MyHeavyFunction viene valutata sempre 1 volta sola.
Invece con
If MyHeavyFunction(x) = val1 Then
...
ElseIf MyHeavyFunction(x) = val2 Then
...
ElseIf MyHeavyFunction(x) = val3 Then
...
End If
la funzione viene richiamata tante volte finché la condizione ElseIf non 
viene verificata.
Quindi in questo caso "vince" select case.
In generale comunque, per la leggibilità io preferisco sempre Select Case.
L'unica pecca secondo me è che se per caso sei in "edit-while-debug", e vuoi 
aggiungere un caso nuovo, con select devi necessariamente stoppare, mentre 
con if...then...else no.
Bye
Raf

 pesanti.
Beh, dipende dalle esigenze.
Ho costruito per la mia azienda un motore simil-SSIS (ma slegato da 
qualsiasi DBMS) per processare svariati milioni di transazioni bancarie 
al giorno.
Un ritardo di 1ms ad operazione, su 10.000.000 di operazioni sono 10.000 
secondi (3 ore circa) di elaborazione in più.
Nicola

 con if...then...else no.
Vero... purtroppo!


 il costrutto If è più veloce.
Mi sa che questo è uno di quei luoghi comuni duri a morire...
Googlando forse ho trovato l'origine sul NG: pare che qualcuno confrontò le 
velocità di If/Then monolinea e Select Case e risultò che il primo costrutto 
fosse 3 volte più veloce del secondo (senza però precisare il codice di test 
usato).
Ora, da qui arrivare a dire che select in generale sia più lento di if/then 
è tirarla veramente per i capelli, IMHO...
In .NET (C#) è addirittura l'opposto, tra l'altro:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx
Bye
Raf

 Nicola
caspita! se in italia siamo 60 milioni aver 10 milioni di operazioni al giorno vuol dire essere una banca bella grande.
complimenti per avuto l'occasione di lavorarci per loro.

 complimenti per avuto l'occasione di lavorarci per loro.
Non č merito mio ma dell'azienda per la quale lavoro che, hai ragione,
ha i piů grossi gruppi bancari come clienti.
Io sono solo un programmatore. ;-)
Nicola

Anni fa', lavorando prevalentemente con l' elaborazione
dei segnali in tempo reale, mi ero costruito un programmillo
per valutare la velocita' delle varie operazioni e per
poterle conseguentemente ottimizzare.
Ho anche provato l' alternativa If / Select ed e' risultato
che il Select e' normalmente piu' veloce dell' If.
Tra i vari risultati archiviati ho trovato:
'
'    Select Case dA         ' 0.037  [盜].
'    Case Is > 0#           '
'    Case Is < 0#           '
'    Case Is = 0#           '
'    End Select             '
'
'    If dA > 0# Then        ' 0.044  [盜].
'    ElseIf dA < 0# Then    '
'    Else                   '
'    End If                 '
'
Con dA variabile di tipo Double.
Se mai dovesse ancora interessarti posso mandarti una
copia del programma di valutazione tempi (se riesco a
ritrovarlo, dopo il "crash" dell' HD di tre giorni fa'...)
Ciao ed a risentirci presto.
Franco