从优化的角度来看,在 C# unity 中,我们应该直接将数据类型与数字相乘还是每个数字都应该存储在变量中

问题描述

将所有值存储在我们将用于数学计算的变量中是否重要?或者,如果我将结果/变量直接与浮点数相乘也可以,特别是在每帧执行时。

例如,我必须对我的播放器施加计算的力。以下 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);
}

哪个计算速度更快,而无需缓存额外的内存。从 cpu 计算和内存优化的角度来看,哪个更好?

谢谢。

解决方法

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; 无论如何都没用,可以删除或制作成局部变量。