ancora stringhe

di Marco Leoncini, in c#,

incuriosito da questo post sul forum e poi dal blog di andrea mi sono messo a vedere quele fosse il codice prodotto cal compilatore, è la prima volta che lo faccio ma la curiosità è tanta :).
prendiamo queste semplici righe di codice:

StringBuilder sb = new StringBuilder("Ciao"); 

  sb.Append(" da "); sb.Append("Marco");

  
Console.WriteLine(sb.ToString()); 

  ////////////////////////////// 

  string string2 = "ciao " + " da " + "marco" + 
  " e " + "alessio"; 

  Console.WriteLine(string2);

una volta compilato il tutto lo diamo in pasto ad ildasm.exe, il Disassembler fornito insieme all SDK del framevork, il codice prodotto è più o meno (ho tagliato qualcosina) questo

  IL_0000: ldarg.0 

  IL_0001: call instance void [mscorlib]System.Object::.ctor() 

  IL_0006: ldstr "Ciao" 

  IL_000b: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(string) 
  

  IL_0010: stloc.0 IL_0011: ldloc.0 IL_0012: ldstr " da " 

  IL_0017: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) 
  

  IL_001c: pop IL_001d: ldloc.0 

  IL_001e: ldstr "Marco" 

  IL_0023: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) 
  

  IL_0028: pop 

  IL_0029: ldloc.0 IL_002a: callvirt instance string [mscorlib]System.Text.StringBuilder::ToString() 
  

  IL_002f: call void [mscorlib]System.Console::WriteLine(string) <b>

  IL_0034: ldstr "ciao da marco e alessio"</b> 

  IL_0039: stloc.1 

  IL_003a: ldloc.1 

  IL_003b: call void [mscorlib]System.Console::WriteLine(string) 

  IL_0040: ret

da notare il grassetto come il compilatore ottimizzi il codice salvando la stringa già concatenata nei metadati, quindi se si concatenano stringhe il cui "valore" è conosciuto in fase di compilazione il "+" risulta estremamente più performante, sto facendo anche delle prove con una semplicissima applicazione console

  using System; 

  using System.Text; 

  namespace ConsoleApplication1 { 

  class Class1 { 

  [STAThread] static void Main(string[] args) { 

  string a = Console.ReadLine(); 

  string b = Console.ReadLine(); 

  string c = Console.ReadLine(); 

  StringBuilder sb = new StringBuilder(a); 

  sb.Append(b); 

  sb.Append(c); 

  Console.WriteLine(sb.ToString()); 

  string string2 = a+b+c; 

  Console.WriteLine(string2); } } }

  
il codice IL è leggermente più complesso , devo digerirlo :) e capire bene il codice generato spero di tornarci sopra quanto prima, ma ad una prima analisi credo sia sempre il vantaggio String.Concat (o uno dei suoi oevrload) in poco parole sono stato un pò frettoloso a consigliare l'uso di uno StringBuilder, farò altri test (magari non subito :)) visto che voglio capire perbene l'uso del heap gestito e dello stack

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese