Mathf.Floor 与 (int) 在性能方面的区别

4
我正在创建和翻译一些算法,不知道哪个更快?
a) (int)float
或者
b) Mathf.FloorToInt(float)
提前感谢。
编辑:如果有比这两种方法更快的方法,那也是有帮助的。

4
自己进行测量。这并不难。 - Programmer
1
虽然这可能是一个有趣的理论问题,但人们不应该指望选择当前更快的方法会有明显的效果。 - Gedrox
我会尝试运行一些测试,看看是否发生了任何显著的事情。 - sfbea
除非在紧密循环中运行,否则执行时间的差异(如果有)将是微不足道的。此外,即使在同一台机器上,它在不同的环境中也可能会有所不同。 "比赛你的马"。 (https://ericlippert.com/2012/12/17/performance-rant/) - Zohar Peled
该算法涉及许多循环,其中包括我的循环,这也是我想知道的主要原因。 - sfbea
4
FloorToInt(float)会返回(int)Math.Floor((double)f);。仅从这个代码片段来看,我猜测它的速度较慢。此外请注意,(int)float进行截断而不是向下取整,因此对于负数结果将不同。 - Dennis_E
2个回答

5

按照我之前提到的方式,使用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。


从编辑器中获取的数字可能与发布版本中获取的数字非常不同,这是由于编译器优化造成的 - 特别是在使用IL2CPP转换为C++时。 - user45623

4

这取决于你的目标平台。

在编辑器中运行未经过优化的.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())。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接