欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于Unity C# Mathf.Abs()取绝对值性能测试详解

程序员文章站 2023-11-10 08:33:22
前言 之前有人提到过取绝对值时 直接写三目运算符比用mathf.abs()效率高 没觉得能高太多 今天测了一下 真是不测不知道 一测吓一跳 直接写三目运算符比mat...

前言

之前有人提到过取绝对值时 直接写三目运算符比用mathf.abs()效率高 没觉得能高太多

今天测了一下 真是不测不知道 一测吓一跳 直接写三目运算符比mathf.abs()效率高2-3倍

这性能差距有点不太合理啊! 看下源码发现 很多mathf的方法就是多封装了一层math里的方法 把double型转成float型了 即便很简单得方法也没有重新实现

官方有点偷懒了 所以性能差距才会这么大 以后要求性能高的地方要注意 老老实实写一遍 能提升不少性能

关于Unity C# Mathf.Abs()取绝对值性能测试详解

测试代码:

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部分源码:

关于Unity C# Mathf.Abs()取绝对值性能测试详解

关于Unity C# Mathf.Abs()取绝对值性能测试详解

更高性能取绝对值方法:
...

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。