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.
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 #?