关于Unity C# Mathf.Abs()取绝对值性能测试详解
程序员文章站
2022-06-14 17:20:59
前言
之前有人提到过取绝对值时 直接写三目运算符比用mathf.abs()效率高 没觉得能高太多
今天测了一下 真是不测不知道 一测吓一跳 直接写三目运算符比mat...
前言
之前有人提到过取绝对值时 直接写三目运算符比用mathf.abs()效率高 没觉得能高太多
今天测了一下 真是不测不知道 一测吓一跳 直接写三目运算符比mathf.abs()效率高2-3倍
这性能差距有点不太合理啊! 看下源码发现 很多mathf的方法就是多封装了一层math里的方法 把double型转成float型了 即便很简单得方法也没有重新实现
官方有点偷懒了 所以性能差距才会这么大 以后要求性能高的地方要注意 老老实实写一遍 能提升不少性能
测试代码:
using unityengine; using unityeditor; using system.diagnostics; /// <summary> /// 执行时间测试 /// zhangyu 2019-04-04 /// </summary> public class timetest : monobehaviour { public int executetimes = 1; private static stopwatch watch; private void onvalidate() { times = executetimes; } private static int times = 1; [menuitem("context/timetest/执行")] private static void execute() { watch = new stopwatch(); // 数据 float a = 1; // mathf.abs watch.reset(); watch.start(); for (int i = 0; i < times; i++) { a = mathf.abs(a); } watch.stop(); string msgmathfabs = string.format("mathf.abs: {0}s", watch.elapsed); // 自己实现abs watch.reset(); watch.start(); for (int i = 0; i < times; i++) { a = myabs(a); } watch.stop(); string msgmyabs = string.format("自定义abs: {0}s", watch.elapsed); // 三目运算符abs watch.reset(); watch.start(); for (int i = 0; i < times; i++) { a = a < 0 ? -a : a; } watch.stop(); string msg3abs = string.format("三目运算符abs: {0}s", watch.elapsed); print(msgmathfabs); print(msgmyabs); print(msg3abs); } // == 执行次数:10000000 // mathf.abs // (1)0.2803558s // (2)0.2837749s // (3)0.2831089s // (4)0.2829929s // (5)0.2839846s // 自定义abs // (1)0.2162217s // (2)0.2103635s // (3)0.2103390s // (4)0.2092863s // (5)0.2097648s private static float myabs(float a) { return a < 0 ? -a : a; } // 三目运算符abs // (1)0.0893028s // (2)0.1000181s // (3)0.1017959s // (4)0.1001749s // (5)0.1005737s }
mathf.abs()源码:
// returns the absolute value of /f/. public static float abs(float f) { return (float)math.abs(f); } // returns the absolute value of /value/. public static int abs(int value) { return math.abs(value); }
官方mathf部分源码:
更高性能取绝对值方法:
...
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。