Warum verbessert das Hinzufügen eines zusätzlichen Felds zu struct seine Leistung erheblich?

9

Ich habe festgestellt, dass ein Struct, das einen einzelnen Float umschließt, wesentlich langsamer ist als ein float direkt, mit ungefähr der Hälfte der Performance.

%Vor%

Nach dem Hinzufügen eines zusätzlichen "Extra" -Feldes scheint jedoch etwas Magie zu passieren und die Leistung wird wieder vernünftiger:

%Vor%

Der Code, den ich verwendet habe, um diese zu vergleichen, ist wie folgt:

%Vor%

Mit den Benchmark-Ergebnissen:

%Vor%

Compiler / Umgebungseinstellungen: Betriebssystem: Windows 10 64 Bit Werkzeugkette: VS2017 Framework: .Net 4.6.2 Ziel: Jede CPU Prefer 32 Bit

Wenn 64 Bit als Ziel festgelegt wird, sind unsere Ergebnisse vorhersehbarer, aber deutlich schlechter als das, was wir mit Vector1Magic auf dem 32-Bit-Ziel sehen:

%Vor%

Für die echten Zauberer habe ich hier einen Auszug der IL eingefügt: Ссылка

Weitere Untersuchungen zeigen, dass dies spezifisch für die Windows-Laufzeit zu sein scheint, da der Mono-Compiler die gleiche IL erzeugt.

Beide Struct-Varianten haben auf der Mono-Runtime im Vergleich zum rohen Float eine ungefähr doppelt so lange Performance. Das ist ein bisschen anders als die Leistung, die wir auf .Net sehen.

Was ist hier los?

* Beachten Sie, dass diese Frage ursprünglich einen fehlerhaften Benchmark-Prozess beinhaltete (Danke Max Payne für den Hinweis darauf), und aktualisiert wurde, um die Zeitpunkte genauer widerzuspiegeln.

    
Varon 03.06.2017, 14:06
quelle

1 Antwort

0

Das sollte nicht passieren. Dies ist offensichtlich eine Art Missachtung, die das JIT dazu zwingt, nicht so zu arbeiten, wie es sollte.

%Vor%

Sie müssen auch anrufen: Console.WriteLine (total); wodurch die Zeit genau auf die Vector1Magic-Zeit erhöht wird, was sinnvoll ist. Die Frage ist immer noch, warum Vector1 so langsam ist.

Vielleicht sind Strukturen nicht für sizeof (foo) & lt; optimiert. 64 Bit im 64-Bit-Modus.

Es scheint, dass dies vor sieben Jahren angeklagt wurde: Warum ist 16 Byte die empfohlene Größe für struct in C #?

    
Max Payne 03.06.2017 19:58
quelle

Tags und Links