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

从优化的角度来看,在C#unity中,我们应该直接将数据类型与数字相乘,还是将每个数字存储在变量中,c#,optimization,memory-management,C#,Optimization,Memory Management,将所有值存储在我们将用于数学计算的变量中是否重要?或者,如果我直接将一个结果/变量与浮点数相乘,也可以,特别是当它将在每一帧执行时 例如,我必须对我的球员施加一个经过计算的力。以下两种方法中哪一种是最佳的优化方法,以及如何优化 代码1:直接乘法 Rigidbody Player; void Update() { Player.AddForce(Vector3.forward * 2.5f * 4.5f * 2); } 或 哪一个在不缓存额外内存的情况下计算得更快。从CPU计算和内存优

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

例如,我必须对我的球员施加一个经过计算的力。以下两种方法中哪一种是最佳的优化方法,以及如何优化

代码1:直接乘法

Rigidbody Player;

void Update()
{
    Player.AddForce(Vector3.forward * 2.5f * 4.5f * 2);
}

哪一个在不缓存额外内存的情况下计算得更快。从CPU计算和内存优化的角度来看,哪一个更好


谢谢。

TL;博士无论哪种方式,差异都是最小的


*2.5f*4.5f*2
肯定会被JIT或本机编译器(AOT)完全内联

另一方面,将它们保存在变量中有利于封装和避免幻数。它可能会稍微慢一点,也可能不会,但您实际上只是在谈论几个时钟周期

这取决于编译器优化的程度。我怀疑如果它们是字段,可能不会进行优化,而局部变量将是内联的

通过使用常量来充分利用这两个方面,它们将像第一个选项一样内联。

const float speed=2.5f;
常数浮点速度_乘数=4.5f;
恒浮附加力=2;

顺便提一下,
浮动合力
无论如何都是无用的,可以删除或生成局部变量。

TL;博士无论哪种方式,差异都是最小的


*2.5f*4.5f*2
肯定会被JIT或本机编译器(AOT)完全内联

另一方面,将它们保存在变量中有利于封装和避免幻数。它可能会稍微慢一点,也可能不会,但您实际上只是在谈论几个时钟周期

这取决于编译器优化的程度。我怀疑如果它们是字段,可能不会进行优化,而局部变量将是内联的

通过使用常量来充分利用这两个方面,它们将像第一个选项一样内联。

const float speed=2.5f;
常数浮点速度_乘数=4.5f;
恒浮附加力=2;

顺便提一下,
浮动合力
无论如何都是无用的,可以删除或生成局部变量。

正如您所说,字段不会被优化。你能澄清一下这种情况吗?我的目标主要是中端设备上的Android游戏-大多数变量都是公共的,因此它们要么在运行时分配,要么通过另一个对象分配。-在整个游戏过程中,可以有常量值的变量非常少。谢谢你的详细回答。我非常怀疑它有什么明显的区别,除非你在一个非常紧密的循环中运行它。但如果您需要这些公共属性/字段,则别无选择。一个基本的自动属性会将它的getter内联到一个字段访问。正如你所说的,字段不会被优化。你能澄清一下这种情况吗?我的目标主要是中端设备上的Android游戏-大多数变量都是公共的,因此它们要么在运行时分配,要么通过另一个对象分配。-在整个游戏过程中,可以有常量值的变量非常少。谢谢你的详细回答。我非常怀疑它有什么明显的区别,除非你在一个非常紧密的循环中运行它。但如果您需要这些公共属性/字段,则别无选择。基本的auto属性将其getter内联到字段访问。
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);
}