Durante il mio blogwalking serale, passando dal blog di Daniele sono finito sul blog di Andrea il quale cita dei benchmarking che mi hanno incuriosito, sopratutto dopo avere letto tempo fa il blog di Paul Vick proprio a questo riguardo.
Andrea cita: "Nel primo caso, l'utilizzo della classe Convert al posto delle funzioni cint, cdbl, ecc... aumenta le prestazioni del 100% da prove effettuate personalmente"
Vediamo..
VB1
Sub Main()
Dim i As Int32 = 13
Dim d As Double = CDbl(i)
End Sub
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 7 (0x7)
.maxstack 1
.locals init (float64 V_0,
int32 V_1)
IL_0000: ldc.i4.s 13
IL_0002: stloc.1
IL_0003: ldloc.1
IL_0004: conv.r8
IL_0005: stloc.0
IL_0006: ret
} // end of method Module1::Main
C#1
static void Main(string[] args)
{
Int32 i=13;
double d=System.Convert.ToDouble(i);
}
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldc.i4.s 13
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: call float64 [mscorlib]System.Convert::ToDouble(int32)
IL_0009: pop
IL_000a: ret
} // end of method Class1::Main
C#2
static void Main(string[] args)
{
Int32 i=13;
double d=(double)(i);
}
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 7 (0x7)
.maxstack 1
.locals init ([0] int32 i,
[1] float64 d)
IL_0000: ldc.i4.s 13
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: conv.r8
IL_0005: stloc.1
IL_0006: ret
} // end of method Class1::Main
Come potete facilmente notare l'IL di VB1 e C#2 sono praticamente identici e questo conferma quando detto da Paul Vick ovvero che alcuni operatori di conversione di VB.NET hanno la relativa controparte IL (a differenza di System.Convert)
Alcune altre conversioni invece si appoggiano su helper functions implementate nella VisualBasic.dll ad esempio CInt che mappa su
Microsoft.VisualBasic.CompilerServices.IntegerType::FromString(string)
Il motivo di questo?, per poter permettere di scrivere questo
Dim s As String = "10,6"
Dim i As Int32 = CInt(s) '// i=11 <-notare l'arrotondamento...
Visto che Int32.Parse e System.Convert falliscono...
e l'equivalente in C#?
string s="10,6";
double d;
double.TryParse(s,System.Globalization.NumberStyles.AllowDecimalPoint,System.Globalization.CultureInfo.CurrentCulture,out d);
Int32 i=(Int32)Math.Round(d,0);
Che guarda caso e' piu' o meno quello che fa IntegerType::FromString...
Morale della notte...
Ogni cosa ha il suo perche', come pure le conversioni.
Vero e' che il codice IL di C# e' migliore rispetto a quello di VB.NET ma rimane sempre vero che la differenza la fa il programmatore... ;-)