Der Compiler verwendet immer noch die newarr
IL-Anweisung, so dass die CLR das Array immer noch initialisiert.
Die Initialisierung der Sammlung ist nur Compiler-Magie - die CLR weiß nichts darüber, also wird sie immer noch davon ausgehen, dass sie eine Plausibilitätsprüfung durchführen muss.
Aber das sollte wirklich, wirklich schnell sein - es wischt nur Speicher. Ich bezweifle, dass dies in vielen Situationen ein erheblicher Aufwand ist.
Ich habe einen kurzen Test zur Instanziierung eines Arrays mit der von Ihnen beschriebenen Syntax durchgeführt und festgestellt, dass die Instanziierung mit nicht standardmäßigen Werten etwa 2,2-mal länger dauert als die Instanziierung mit Standardwerten.
Wenn ich mit Standardwerten umschalte und instanziiere, dauert es ungefähr die gleiche Zeit.
Wenn ich mir die Dekompilierung anschaue, sieht es so aus, als würde das Array initialisiert und dann mit allen Werten gefüllt, die nicht die Standardwerte sind.
Instanziieren mit nicht standardmäßigen Werten:
%Vor%Instanziieren mit Standardwerten:
%Vor%Es ist nicht möglich, die Initialisierung jedes Array-Slots auf den Standardwert zu vermeiden, zumindest in der IL-Ebene.
String ist eine Klasse, keine Struktur.
Das bedeutet A, B, C, D und der Sarray könnte in jeder Position gespeichert werden. A, B, C und D könnten aus dem Internpool stammen, dass der Verweis auf das Objekt dynamisch sein könnte.
Aber ich glaube, dass das JIT schlau genug sein könnte, um die Hälfte dieser Kosten zu reduzieren.
PS. Vorzeitige Optimierung ist die Wurzel allen Übels.
Tags und Links optimization c# compiler-construction c#-3.0