Optimaliseert C# de aaneenschakeling van letterlijke tekenreeksen?

Weet de compiler bijvoorbeeld dat hij moet vertalen

string s = "test " + "this " + "function";

naar

string s = "test this function";

en zo de prestatiehit met de string-aaneenschakeling vermijden?


Antwoord 1, autoriteit 100%

Ja. Dit wordt gegarandeerd door de C#-specificatie. Het staat in sectie 7.18 (van de C# 3.0-specificatie):

Telkens wanneer een uitdrukking voldoet aan de
bovenstaande vereisten, de
uitdrukking wordt geëvalueerd op
compileertijd. Dit is waar, zelfs als de
uitdrukking is een onderuitdrukking van a
grotere uitdrukking die bevat
niet-constante constructies.

(De “hierboven vermelde vereisten” omvatten de + operator toegepast op twee constante expressies.)

Zie ook deze vraag.


Antwoord 2, autoriteit 35%

Een kanttekening over een gerelateerd onderwerp – de C#-compiler zal ook meerdere aaneenschakelingen met niet-letterlijke termen ‘optimaliseren’ met behulp van de ‘+‘-operator tot een enkele aanroep naar een overbelasting van meerdere parameters van de String.Concat() methode.

Dus

string result = x + y + z;

compileert naar iets dat gelijk is aan

string result = String.Concat( x, y, z);

in plaats van de meer naïeve mogelijkheid:

string result = String.Concat( String.Concat( x, y), z);

Niets wereldschokkends, maar ik wilde dit stukje toevoegen aan de discussie over het optimaliseren van letterlijke aaneenschakeling van strings. Ik weet niet of dit gedrag wordt voorgeschreven door de taalstandaard of niet.


Antwoord 3, autoriteit 16%

Ja.

C# optimaliseert niet alleen de aaneenschakeling van letterlijke tekenreeksen, het vouwt ook equivalente letterlijke tekenreeksen samen in constanten en gebruikt pointers om alle verwijzingen naar dezelfde constante te verwijzen.


Antwoord 4, autoriteit 10%

Ja – U kunt dit expliciet zien met ILDASM.

Voorbeeld:

Hier is een programma dat lijkt op uw voorbeeld, gevolgd door de gecompileerde CIL-code:

Opmerking: ik gebruik de functie String.Concat() alleen om te zien hoe de compiler de twee verschillende methoden van samenvoeging behandelt.

Programma

class Program
{
    static void Main(string[] args)
    {
        string s = "test " + "this " + "function";
        string ss = String.Concat("test", "this", "function");
    }
}

ILDASM

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       29 (0x1d)
  .maxstack  3
  .locals init (string V_0,
           string V_1)
  IL_0000:  nop
  IL_0001:  ldstr      "test this function"
  IL_0006:  stloc.0
  IL_0007:  ldstr      "test"
  IL_000c:  ldstr      "this"
  IL_0011:  ldstr      "function"
  IL_0016:  call       string [mscorlib]System.String::Concat(string,
                                                              string,
                                                              string)
  IL_001b:  stloc.1
  IL_001c:  ret
} // end of method Program::Main

Merk op hoe de compiler op IL_0001 de constante “test deze functie” heeft gemaakt in tegenstelling tot hoe de compiler de functie String.Concat() behandelt – die een constante creëert voor elk van de .Concat()-params en vervolgens de . Concat() functie.


Antwoord 5, autoriteit 8%

Uit de mond van het paard:

Aaneenschakeling is het proces van het toevoegen van één string aan het einde van een andere reeks. Wanneer u de string-literatuur of stringconstanten aaneengeeft door de + -operator te gebruiken, creëert de compiler een enkele tekenreeks. Geen runtime-aaneenschakeling vindt plaats. Stringvariabelen kunnen echter slechts op looptijd worden aangecaten. In dit geval moet u de prestatie-implicaties van de verschillende benaderingen begrijpen.

http://msdn.microsoft.com/en-us/library /MS228504.aspx


Antwoord 6, Autoriteit 3%

Ik geloof het antwoord op dat is ja, maar je zou moeten kijken naar wat de compiler uitspitst … gewoon compileren en reflector op het doen: -)


Antwoord 7, Autoriteit 3%

Ik had een vergelijkbare vraag, maar over vb.net in plaats van C #. De eenvoudigste manier om dit te verifiëren, was om de gecompileerde montage onder reflector te bekijken.

Het antwoord was dat zowel de C # en VB.NET-compiler de aaneenschakeling van string-literalen optimaliseren.

Other episodes