Speicherlayoutoptimierung in C #

9

Haftungsausschluss: Es könnte einige Missverständnisse in der Formulierung unten geben, bitte korrigieren Sie mich, wenn ich den wy mein Code in C # gehandhabt habe, zwischen dem Moment, an dem ich es schreibe an den Punkt wie Nullen und Einsen aussieht

Die Fragen sind die folgenden (die verknüpft sind):

Gibt es eine Möglichkeit in C #, wo meine Datenstrukturen und / oder meine Datenmanipulationsimplementierung Auswirkungen auf die Leistung haben, ob ich Optimierungstechniken verwende oder nicht?

Was macht der Compiler bei der Ausgabe von IL, ist er zuverlässig? Bedeutung: Wenn ich meine Daten SOA mache, wird es SOA in IL sein? Immer?

Was passiert mit meiner Datenstruktur, wenn das JIT das IL liest? ist es verändert? Wird es automatisch für meinen Prozessor optimiert?

cf: das spricht über C / C ++

Ich weiß, dass dieser Vortrag auf nativen Code ausgerichtet ist und spricht über die Besonderheiten des Prozessorlayouts im Vergleich zu Ihrem Datenlayout in nativem Code.

Ich kenne auch den C # -Compiler, und der JIT-Compiler wird die Dinge für mich in Bezug auf diese Probleme optimieren.

Im Grunde frage ich mich, ob diese Art von Optimierung einen Einfluss auf meine Fähigkeiten haben wird:

  • SOA statt AOS
  • Vektoren Zugriffsmuster (auf die zusammenhängend im Speicher zugegriffen wird)
  • usw. ... Sie nennen es ...

Ich arbeite in der Spieleentwicklung und die Leistung ist kritisch, wir manipulieren große Datenmengen und wir müssen das mindestens 24 Mal pro Sekunde machen, ich kann nicht den GC Sachen für 300ms machen oder den Speicher, auf den zugegriffen werden soll Ort, wenn ich versuche, Kollisionen zwischen 3000 verschiedenen Objekten zu erkennen

Als Hinweis auf Dinge, die ich gelesen habe, beantworte ich aber nicht wirklich die Frage:

Aber diese antworten nicht auf die Leistungskosten im Vergleich zur Prozessor- und Datenlayout-Implementierung.

Um weiter zu gehen, was Hans antwortete:

Wenn Sie sagen: "Sie können SOA verfolgen, aber das hilft nicht. Ja, Ihr Programm wird wegen all der Struktur kopieren langsamer und tut dies in einer deterministischen Art. Aber es stoppt nicht den Regen. Sie bekomme das Schlimmste von beiden, ein langsames Programm und genau die gleichen Pausen. "

Es bedeutet nicht, dass mein Programm nichts von SOA profitiert, es wird (möglicherweise) schneller sein, weil es bei der Verarbeitung meiner Daten helfen wird. Nur dass es keinen Einfluss auf den GC selbst hat.

Wenn ich SOA oder andere Verbesserungen in meinem Datenlayout nicht mache, wird der Compiler das für mich nicht verbessern, oder? Ich kann mich nicht darauf verlassen, dass der Compiler mit solchen Dingen fertig wird.

    
Géry Arduino 22.03.2015, 09:13
quelle

1 Antwort

4

Sich Sorgen um den GC zu machen ist, als ob man sich Sorgen machen müsste, ob es heute regnen wird. Es wird früher oder später regnen, nichts, was Sie tun können, um es zu stoppen. Und es ist erforderlich , du kannst diesen Rasen nicht schön grün aussehen lassen, wenn er es nicht tut. Was Sie nie tun wollen, ist absichtlich zu verhindern, dass es regnet. Denn wenn du es tust, wird es in einer Sintflut herunterkommen und diesen schönen Rasen verschütten. Ein stetiger Nieselregen ist was du willst. Und am besten nachts, wenn du nicht hinschaust.

Das .NET GC unterstützt dies stark. Nur die kleinen gen # 0 und # 1 Sammlungen unterbrechen Ihr Programm. Die teure Gen # 2-Sammlung wird im Hintergrund ausgeführt, während der Code weiterhin ausgeführt wird. Worst-Case-Pause schwebt irgendwo in der Nähe von hundert Mikrosekunden. Was von anderen Gründen nicht zu unterscheiden ist, wird Ihr Programm auf einem modernen Betriebssystem pausieren. So wie Ihre Spielschleife vorübergehend unterbrochen wird, weil ein anderer Kernthread mit höherer Priorität ausgeführt werden muss. Nur ein Nieselregen, für das menschliche Auge nicht wahrnehmbar.

Sie können SOA verfolgen, aber das hilft nicht. Ja, Ihr Programm verlangsamt sich aufgrund all dieser Strukturkopien und dies auf eine deterministische Art und Weise. Aber es hält den Regen nicht auf. Sie erhalten das schlechteste von beiden, ein langsames Programm und die genau gleichen Pausen.

Machen Sie sich keine Sorgen wegen des Regens, stellen Sie nur sicher, dass es zur richtigen Zeit herunterkommt. Um Hintergrund-GCs zu nutzen, möchten Sie Ihre Daten so strukturieren, dass sie entweder sehr kurzlebig sind und daher leicht mit einer Gen # 0/1-Sammlung verschwinden. Oder lebt für sehr lange, so findet es ein komfortables Zuhause in Gen # 2 und bleibt dort für eine Weile. Was im Allgemeinen ein sehr häufiges Muster in Programmen ist, besonders in Spielen. Ziemlich unwahrscheinlich, dass Sie überhaupt etwas tun müssen.

    
Hans Passant 22.03.2015, 10:39
quelle