Erfordert die C # -Collection-Initialisierungssyntax den Standardinitialisierungs-Overhead

7

Wenn Sie die neue C # -Collection-Initialisierungssyntax verwenden:

%Vor%

vermeidet der Compiler die Initialisierung jedes Array-Slots auf den Standardwert oder entspricht dies:

%Vor%     
LBushkin 18.06.2009, 17:44
quelle

4 Antworten

13

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.

    
Jon Skeet 18.06.2009, 17:49
quelle
10

Schnelltest:

%Vor%

führt zu diesem IL (beachten Sie, dass beide identisch sind)

%Vor%     
BFree 18.06.2009 17:50
quelle
1

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%     
patjbs 18.06.2009 17:55
quelle
0

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.

    
Dennis C 15.09.2009 16:53
quelle