Чому Farseer 2.x зберігає часописи як членів, а не в стеці? (.NET)


10

ОНОВЛЕННЯ: Це питання стосується Farseer 2.x. Новий 3.x, схоже, не робить цього.

На даний момент я використовую Farseer Physics Engine досить широко, і я помітив, що, здається, зберігається багато тимчасових типів значень як членів класу, а не в стеці, як можна було б очікувати.

Ось приклад з Bodyкласу:

private Vector2 _worldPositionTemp = Vector2.Zero;

private Matrix _bodyMatrixTemp = Matrix.Identity;
private Matrix _rotationMatrixTemp = Matrix.Identity;
private Matrix _translationMatrixTemp = Matrix.Identity;

public void GetBodyMatrix(out Matrix bodyMatrix)
{
    Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp);
    Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp);
    Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix);
}

public Vector2 GetWorldPosition(Vector2 localPosition)
{
    GetBodyMatrix(out _bodyMatrixTemp);
    Vector2.Transform(ref localPosition, ref _bodyMatrixTemp, out _worldPositionTemp);
    return _worldPositionTemp;
}

Це виглядає як його власна оптимізація продуктивності. Але я не бачу, як це могло б допомогти продуктивності? (Якщо що-небудь, я думаю, це зашкодить, зробивши предмети значно більшими).

Відповіді:


6

Хоча типи значень .NET зберігаються на стеці, що призводить до мінімальних витрат на розподіл, однак це не виключає витрат на ініціалізацію.

У цьому випадку ми маємо набір функцій, використовуючи одну або дві тимчасові матриці, що призведе до ініціалізації 16-32 плавців за виклик. Хоча це може здатися незначним, якщо методи використовуються досить часто (скажімо, тисячі та тисячі разів на кадр), загальний накладний наклад може мати істотний вплив. Якщо такий прийом застосовується систематично для всіх таких методів, то усунення накладних витрат може бути значним.

Хоча використання такої методики виключає здатність забезпечувати безпеку нитки на рівні об'єкта, як правило, нерозумно забезпечувати цю гарантію на такому зернистому рівні.


Ви впевнені в цьому? Я вважав, що це могло б уникнути виклику конструкторів. Але для типів значень вам не потрібно викликати конструктор - включаючи конструктор без параметрів за замовчуванням - якщо ви збираєтеся встановити всі члени (або передавати його як outпараметр). Я досить впевнений, що вся суть цього правила полягає в тому, щоб компілятор міг пропустити нулю цю пам'ять - так? (Це дійсно так повільно переміщувати покажчик стека?)
Ендрю Рассел

Дивно, ні? На жаль, якщо ви перевіряєте створений ІР, тимчасові матриці ініціалізуються. Кілька швидких тестів показують, що версія темп-члена на ~ 10-15% швидша.
Джейсон Козак

1
Я приголомшений . У "Розуміння продуктивності XNA Framework" (GDC2008) Шон Харгрівз говорить про структури: "[JIT] зазвичай з'ясовує:" У наступному рядку він негайно встановлює всі три поля [Vector3], тому мені навіть не потрібно ініціалізувати його до нуля "" . Звідки походить моя інформація. Але, слухаючи зараз знову, він говорить лише "зазвичай". Безпосереднім наступним моментом презентації є те, що JIT поводиться по-різному з доданим налагоджувачем, що впливає на продуктивність (як ви протестували?). Також: він говорить тут про JIT, тож, можливо, ІЛ залишається «приємним» (перевіреність?).
Ендрю Рассел

ІЛ перевіряли за допомогою Reflector, і тести проводилися поза IDE, вбудованим у випуску (у Windows, я більше не маю членства в ЦК для тестування)
Джейсон Козак

1
Виходячи з цього - мені цікаво, чи було б краще (і наскільки це було б краще) зробити цих членів-членів static(та / або більш агресивно використовувати їх). Так само, наприклад, у Bodyкласі Farseer є близько 73 поплавців, варті "непотрібних" членів.
Ендрю Рассел

-1

Хороше питання. Я досить гострий C # /. NET хлопець і трохи гайка продуктивності, і це здається мені досить дивним дизайнерським рішенням. Перше, що вискакує у мене, це те, що цей код жодним чином не є безпечним для потоків. Я не знаю, чи це проблема в фізичній системі, але зберігання тимчасових даних за межами методу часто є рецептом катастрофи.

Чесно кажучи, якби я регулярно стикався з таким кодом у сторонніх рамках, я, мабуть, спробував би знайти інший фреймворк.


3
Насправді не відповідає на питання.
Брайан Ортіз

Так, найкраще, що я міг зробити, - це підтвердити, що він не божевільний, і, здається, немає ніякої реальної користі, оскільки він кодується таким чином. Єдине з'ясування справжнього наміру - це запитати хлопця, який написав код :).
Майк Стробель

Спасибі, Майку. Я починаю підозрювати, що оригінальний розробник божевільний, а не я. Але це завжди допомагає перевірити;)
Ендрю Рассел

Безпека нитки іноді може бути дорогою гарантією, особливо при написанні важкої бібліотеки для обчислень FP для платформи, яка не використовує інструкції SIMD.
Джейсон Козак

-1

В основному GC на 360 представляє лише колекції GEN 2, які є дорогими, тому тимчасові змінні, які створюються та видаляються кожен кадр (як тимчасові об’єкти), викликають запуск цілих колекцій, що дуже швидко знищить продуктивність.

Я підозрюю, що вони зробили це таким чином, щоб повторно використовувати цей об'єкт, а не збирати його.


1
Це трапилось і у мене, але тимчасові члени, схоже, є типовими значеннями, тому їх все одно не виділятимуть на керовану купу.
Майк Стробель

2
Правильно, але тільки якщо вони є членами класу. Якщо вони є місцевими жителями (методом), вони будуть виділені на стеку. Питання в тому, чому вони просто не пішли цим шляхом.
Майк Стробель

1
@Blair - Відповідно до MSDN ( msdn.microsoft.com/en-us/library/bb203912.aspx ) Xbox360 використовує .NET Compact Framework. Здається, що різниця в GC пов'язана з цим, тому я б продовжував це для подальшого дослідження цього питання.
Логан Кінкейд

1
@Blair: @ Логан Кінкейд правильний. Колектор сміття CF поводиться інакше, ніж у звичайних рамках. У XNA Game Studio 3.0 Unleashed досить добре поговорити на цю тему - проте ця книга незабаром застаріла з випуском 4.0.
Стівен Еверс

1
@Blair: Через обмежене середовище пам'яті 360 (і більшість пристроїв, націлених через CF), використовується Mark & ​​Sweep GC. Як результат, багато невеликих виділень запустить колекцію, а час збору відносно # посилань. Багато деталей тут: download.microsoft.com/…/Mobility/…
Джейсон Козак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.