Return True

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

Print | posted on venerdì 5 novembre 2004 19:28

Comments on this post

# re: Return True

Requesting Gravatar...
L'uso di uno dei tre metodi (che in C# diventano 2) è stabilito dalla reale esigenza. Dovendo (o potendo) scegliere uso il primo perchè è un sistema simile a quello utilizzato da C# e altri linguaggi (vedi, ad esempio, java).

IMHO
Left by Fabio Cozzolino on nov 05, 2004 6:50

# re: Return True

Requesting Gravatar...
Penso che le considerazioni debbano essere prese considerando il codice IL generato in Release Mode, ad esempio il nop serve al debugger per permetterti di importare il brekpoint quando sei in Debug mode.
Infatti compilando in Release mode sono, fortunatamente, diversi.

.method private static bool ProvaBool1() cil managed
{
// Code size 2 (0x2)
.maxstack 1
.locals init (bool V_0)
IL_0000: ldc.i4.1
IL_0001: ret
} // end of method Module1::ProvaBool1


.method private static bool ProvaBool2() cil managed
{
// Code size 4 (0x4)
.maxstack 1
.locals init (bool V_0)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ret
} // end of method Module1::ProvaBool2


.method private static bool ProvaBool3() cil managed
{
// Code size 4 (0x4)
.maxstack 1
.locals init (bool V_0,
bool V_1)
IL_0000: ldc.i4.1
IL_0001: stloc.1
IL_0002: ldloc.1
IL_0003: ret
} // end of method Module1::ProvaBool3
Left by Corrado Cavalli on nov 05, 2004 10:08

# re: Return True

Requesting Gravatar...
Pork... Mi era venuto lo stesso dubbio oggi leggendo il post di Adrian! Grazie Corrado, provvederò a rettificare...
Fortuna che ci sei tu!
Left by Michele Bernardi on nov 08, 2004 7:29
Comments have been closed on this topic.