2015-03-22 21 views
9

Zrzeczenie się: w poniższym frazie mogą być pewne nieporozumienia, proszę poprawić mnie, jeśli źle zinterpretuję wy mój kod jest obsługiwany w C# od momentu, w którym napisałem go do punktu, który wygląda jak zera i jedynkiOptymalizacja układu pamięci w C#

pytania są następujące (te są powiązane):

czy istnieje sposób w C#, gdzie moje struktury danych i/lub moja realizacja manipulacji danymi, będą miały wpływ na wydajność, czy mogę używać technik optymalizacji, czy też nie ?

Co robi kompilator podczas wysyłania IL, czy jest niezawodny? Czyli: jeśli tworzę moje dane SOA będzie to SOA w IL? Zawsze?

Co dzieje się z moją strukturą danych, gdy JIT odczytuje IL? czy to się zmieniło? jest automatycznie zoptymalizowany, aby pasował do mojego procesora?

cf: that talk about C/C++

wiem, że ta rozmowa jest skierowany do natywnego kodu i opowiada o specyfice układzie procesora vs układu danych w natywnym kodzie.

Wiem również kompilator C#, a kompilator JIT zoptymalizuje rzeczy dla mnie w odniesieniu do tych problemów.

Zasadniczo Zastanawiam się, czy te rodzaj optymalizacji będzie miało wpływ na moje perfs:

  • SOA zamiast AOS
  • wektorów wzory dostępu (aby uzyskać dostęp zwarty w pamięci)
  • etc .. czy nazywasz to ...

Pracuję nad rozwojem gier, a wydajność ma kluczowe znaczenie, manipulujemy dużą ilością danych i musimy to robić co najmniej 24 razy na sekundę, nie mogę mieć GC robić rzeczy dla 300ms lub pamięci mają być dostępne/przeznaczono na miejsce, gdy próbuję wykrywania kolizji pomiędzy 3000 różnych obiektów

Dla porównania na temat rzeczy czytałem, ale tak naprawdę nie odpowiedzieć na pytanie:

Ale te nie odpowiadają kosztom wydajności w stosunku do wdrożenia procesora i układu danych.


Aby przejść dalej, po czym odpowiedział Hans:

Kiedy mówisz: „Można realizować SOA ale to nie pomaga Tak, program będzie spowalniać z powodu całej tej struktury kopiowania i robi. więc w deterministyczny sposób, ale nie powstrzymuje to deszczu.Otrzymujesz najgorszy z obu, powolny program i dokładnie takie same pauzy. "

To nie znaczy, że mój program nic nie zyskuje na SOA, ale będzie szybszy (potencjalnie), ponieważ pomoże mi przetworzyć moje dane. nie będzie miał wpływu na GC sam w sobie.Nie ma to żadnego wpływu na GC sam w sobie.Nie ma to żadnego wpływu na GC sam w sobie.Nie jest tak, że jeśli nie robię SOA lub innych ulepszeń w moim układzie danych, kompilator nie poprawi tego dla mnie, prawda? Nie mogę polegać na kompilatorze do radzić sobie z tego rodzaju problemami?

+1

Jeśli mówisz o tym poziomie rzeczy, C# (lub dowolne środowisko pamięci zarządzanej) prawdopodobnie nie jest dla ciebie. Ale potem znowu ... pracujesz w obliczeniach czasu rzeczywistego, kalkulacji finansowej, dużych danych itp.? – Aron

+1

Realtime, ale C# może być używany poprawnie, aby zapewnić ten poziom kontroli, mam nadzieję, że –

+1

Układ nie został zasadniczo zmieniony. – harold

Odpowiedz

3

Martwienie się o GC jest jak martwienie się o to, czy dzisiaj będzie padać, wcześniej czy później będzie padać, nic, co możesz zrobić, aby to powstrzymać, a to wymaga d, nie można utrzymywać zielonego trawnika, jeśli go nie ma. To, czego nigdy nie chcesz zrobić, to celowo powstrzymać przed deszczem. Bo jeśli to zrobisz, spadnie w potopie, rozlewając ten piękny trawnik. Ciągła mżawka jest tym, czego chcesz. A najlepiej w nocy, kiedy nie patrzysz.

.NET GC zdecydowanie popiera to. Tylko małe kolekcje gen # 0 i # 1 zatrzymają twój program. Kosztowna kolekcja gen # 2 dzieje się w tle, podczas gdy twój kod kontynuuje wykonywanie. Najgorsza pauza zawiesza się w okolicach stu mikrosekund. Co jest całkiem nieodróżnialne od innych powodów, dla których twój program zatrzyma się na nowoczesnym systemie operacyjnym. Podobnie jak pętla gry zostaje tymczasowo zawieszona, ponieważ musi zostać uruchomiony inny wątek jądra o wyższym priorytecie. Po prostu mżawka, nieobserwowalna dla ludzkiego oka.

Możesz realizować SOA, ale to nie pomaga. Tak, twój program zwolni z powodu kopiowania całej struktury i zrobi to w deterministyczny sposób. Ale to nie powstrzymuje deszczu. Otrzymasz najgorszy z obu, powolny program i dokładnie takie same pauzy.

Nie martw się o deszcz, tylko upewnij się, że spływa we właściwym czasie. Aby skorzystać z GC w tle, które chcesz uporządkować dane, tak że jest bardzo krótki czas, więc łatwo znika z kolekcji gen # 0/1. Lub żyje bardzo długo, więc znajduje wygodny dom w gen. 2 i zostaje tam przez jakiś czas. Ogólnie jest to bardzo powszechny wzorzec w programach, zwłaszcza w grach. Bardzo mało prawdopodobne, żebyś w ogóle coś zrobił.

+0

"Możesz realizować architekturę SOA, ale to nie pomaga" - huh? Nie widzę żadnego powodu, dla którego GC miałaby jakiś wpływ na wzorce dostępu do pamięci programu i wynikające z tego skutki z powodu buforowania itp. Również przynajmniej dla .NET 4.5 (nawet w trybie SustainedLowLatency) nie jest prawdą, że nie ma żadnych GC stop-the-world - są one tylko rzadsze niż wcześniej. – Voo

+0

Nie mam pojęcia, jaki jest twój komentarz, proszę zamieścić własną odpowiedź. –

+1

Myślałem, że jednym z powodów komentarzy było zakwestionowanie faktów zamieszczonych w odpowiedziach i poproszenie o wyjaśnienia lub poprawki, zamiast po prostu odstąpić od odpowiedzi. – Voo