Quale di questi 3 metodi é il più efficiente?
PrivateFunction ProvaBool1()AsBoolean
ReturnTrue
EndFunction
PrivateFunction ProvaBool2()AsBoolean
ProvaBool2 =True
EndFunction
PrivateFunction ProvaBool3()AsBoolean
Dim ResAsBoolean =True
Return Res
EndFunction
Da quello che credevo avrei pensato il primo, invece devo ricredermi!
Ma chi ha scritto il compilatore VB?
Premetto che sul mio computer é considerata una bestemmia mettere Option Strict Off...
L'IL generato da ProvaBool2 é:
.method private instance bool ProvaBool2() cil managed
{
// Code Size: 5 byte(s)
.maxstack 1
.locals (
bool flag1)
L_0000: nop
L_0001: ldc.i4.1
L_0002: stloc.0
L_0003: ldloc.0
L_0004: ret
} |
In un certo senso é quello che mi aspettavo: una variabile locale, prendo il valore di true (1) lo scrivo sullo stack, copio dallo stack il primo valore e lo scrivo nella variabile locale di indice 0, carico il valore della variabile locale di indice 0 nello stack e ritorno il valore.
Questo invece é l'IL di ProvaBool1:
.method private instance bool ProvaBool1() cil managed
{
// Code Size: 7 byte(s)
.maxstack 1
.locals (
bool flag1)
L_0000: nop
L_0001: ldc.i4.1
L_0002: stloc.0
L_0003: br.s L_0005
L_0005: ldloc.0
L_0006: ret
}
|
Peggio di prima!
Fa lo stesso giro ed in più aggiunge un JUMP incondizionato dall'istruzione 3 all'istruzione 5!
Il terzo metodo é chiaramente il più inefficiente di tutti.
Cosa fare allora? Tenendo conto di:
1) La differenza di prestazioni é infinitesimale (tra l'altro il JIT potrebbe colmare le differenze)
2) Inserito in un altro contesto il codice IL generato potrebbe essere diverso (SPERO!)
3) Dal punto di vista della pulizia del codice il sistema 1 mi sembra il più pulito
Io propenderei per ritornare direttamente il valore quando possibile, sicuramente evitate come la peste di definire una variabile apposta da ritornare successivamente come risultato della funzione!
Cosa ne pensate voi? I vostri feedback please!
Aggiunto dopo il commento di Fabio:
Questo é il codice prodotto da C# per
public
bool ProvaBool1(){
return true;}
.method public hidebysig instance bool ProvaBool1() cil managed
{
// Code Size: 6 byte(s)
.maxstack 1
.locals (
bool flag1)
L_0000: ldc.i4.1
L_0001: stloc.0
L_0002: br.s L_0004
L_0004: ldloc.0
L_0005: ret
}
A parte il nop iniziale (perché?) il codice é sostanzialmente lo stesso schifo di quello VB. Mi piacerebbe veramente capirne il perché! :-( Boh
powered by IMHO