我正在创建和翻译一些算法,不知道哪个更快?
a) (int)float
或者
b) Mathf.FloorToInt(float)
提前感谢。
编辑:如果有比这两种方法更快的方法,那也是有帮助的。
a) (int)float
或者
b) Mathf.FloorToInt(float)
提前感谢。
编辑:如果有比这两种方法更快的方法,那也是有帮助的。
按照我之前提到的方式,使用Stopwatch做一次测试。我提供这个答案是因为我认为你答案中的结果是错误的。
下面是一个简单的性能测试脚本,它使用循环,因为你的算法涉及许多循环:
void Start()
{
int iterations = 10000000;
//TEST 1
Stopwatch stopwatch1 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
int test1 = (int)0.5f;
}
stopwatch1.Stop();
//TEST 2
Stopwatch stopwatch2 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
int test2 = Mathf.FloorToInt(0.5f);
}
stopwatch2.Stop();
//SHOW RESULT
WriteLog(String.Format("(int)float: {0}", stopwatch1.ElapsedMilliseconds));
WriteLog(String.Format("Mathf.FloorToInt: {0}", stopwatch2.ElapsedMilliseconds));
}
void WriteLog(string log)
{
UnityEngine.Debug.Log(log);
}
输出:
(int)float:73
Mathf.FloorToInt:521
(int)float
明显比 Mathf.FloorToInt
更快。对于这种情况,使用 Editor Stats 中的 FPS 来做判断是非常不好的。你可以使用 Stopwatch
进行测试。在编写着色器代码时应使用 FPS。
这取决于你的目标平台。
在编辑器中运行未经过优化的.NET代码时,(int)
比Mathf.Floor()
快得多,因为后者包含了额外的函数调用费用。
然而,当您编译构建时,根据您的目标平台和构建设置,您的代码可能会被优化得不同。许多构建目标使用IL2CPP将您的代码转译。使用IL2CPP,C#代码被编译为 .NET中间语言(IL),然后被翻译为 C++(CPP),最后编译成适合您目标平台的二进制文件(或编译成WebAssembly用于WebGL构建)。
编译器并不是傻瓜。他们会在实践中优化或甚至内联函数调用。换句话说,编译器可能会将Mathf.Floor()
替换为与(int)
非常相似的东西。
例如,在我自己的测试中,我发现(int)
在编辑器中比Mathf.Floor()
快20倍,但是在一个WebGL构建中速度没有区别。
永远不要仅基于在编辑器中进行测试来做出关于代码性能的决策。您应该在目标平台上测试性能关键代码。话虽如此,通常情况下,游戏代码很少因为这种事情而成为瓶颈。通常的性能瓶颈来自于图形、算法或滥用Unity API(例如不断调用GameObject.Find())。
FloorToInt(float)
会返回(int)Math.Floor((double)f);
。仅从这个代码片段来看,我猜测它的速度较慢。此外请注意,(int)float
进行截断而不是向下取整,因此对于负数结果将不同。 - Dennis_E