#c# #optimization #memory-management
#c# #оптимизация #управление памятью
Вопрос:
Важно ли хранить все значения в переменных, которые мы собираемся использовать для математических вычислений? Или все в порядке, если я умножаю результат / переменную непосредственно на число с плавающей запятой, особенно когда оно будет выполняться каждый кадр.
Например, я должен применить вычисленную силу к моему проигрывателю. Какой наилучший оптимизированный способ из следующих 2 методов и как?
Код 1: умножение напрямую
Rigidbody Player;
void Update()
{
Player.AddForce(Vector3.forward * 2.5f * 4.5f * 2);
}
или
Code 2 : Store values in variables and then use
float speed = 2.5f;
float speed_multiplier = 4.5f;
float additional_force = 2;
float resultant_force;
Rigidbody Player;
void Update()
{
resultant_force = speed * force_multiplier * additional_force;
Player.AddForce(Vector3.forward * resultant_force);
}
Какой из них вычисляется быстрее без кэширования дополнительной памяти. Что лучше с точки зрения вычислений процессора и оптимизации памяти?
Спасибо.
Ответ №1:
TL; DR; Разница будет минимальной в любом случае.
* 2.5f * 4.5f * 2
определенно было бы полностью встроено JIT или собственным компилятором (AOT).
С другой стороны, хранить их в переменных лучше для инкапсуляции и избегать магических чисел. Это может быть немного медленнее, а может и нет, но на самом деле вы говорите только о паре тактов.
Это зависит от того, насколько сильно оптимизируется компилятор. Я подозреваю, что это, вероятно, не было бы оптимизировано, если бы они были полями, тогда как локальные переменные были бы встроены.
Получите лучшее из обоих миров, используя константы, они будут встроены точно так же, как ваш первый вариант.
const float speed = 2.5f;
const float speed_multiplier = 4.5f;
const float additional_force = 2;
Кстати, float resultant_force;
в любом случае бесполезно и может быть удалено или преобразовано в локальную переменную.
Комментарии:
1. Как вы сказали, поля не будут оптимизированы. Можете ли вы прояснить эту ситуацию — я ориентируюсь в основном на игры для Android на средних конечных устройствах — большинство переменных будут общедоступными, поэтому они будут назначаться либо во время выполнения, либо через другой объект. — Существует очень мало переменных, которые могут иметь фактически постоянные значения на протяжении всей игровой сессии. Спасибо за ваш подробный ответ.
2. Я очень сомневаюсь, что это имеет какое-либо заметное значение, если вы не используете его в чрезвычайно узком цикле. Но если вам нужны эти общедоступные свойства / поля, у вас нет другого выбора. Базовое автоматическое свойство будет иметь свой геттер, встроенный в доступ к полю.