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?
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:
Excellent Eric Lippert article about structs and values types in C# (proszę przeczytać, jeśli myślisz, że typy wartości są zawsze na stosie w C# jesteś na leczeniu)
Excellent video about PerfView to track your GC behaviour and it's impact on your perfs
That SO question about Best practices to optimize memory in C# (i co ważniejsze jest to odpowiedź)
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?
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
Realtime, ale C# może być używany poprawnie, aby zapewnić ten poziom kontroli, mam nadzieję, że –
Układ nie został zasadniczo zmieniony. – harold