c#绝对值函数图像_Unity C# Mathf.Abs()取绝对值性能测试

博客测试表明,直接使用三目运算符实现的绝对值函数比Mathf.Abs()快约20%,这是因为Mathf.Abs()在内部调用了Math.Abs()并进行了类型转换。这种性能差距在需要高性能的场景中值得注意,建议根据需求选择适当的方法。
摘要由CSDN通过智能技术生成

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

今天测了一下 真是不测不知道 一测吓一跳 居然快了20%左右

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

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

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); }

测试代码:

using UnityEngine;

using UnityEditor;

using System.Diagnostics;

///

/// 执行时间测试

/// ZhangYu 2019-04-04

///

public class TimeTest : MonoBehaviour {

public int executeTimes = 1;

private void OnValidate() {

times = executeTimes;

}

/// 执行次数

private static int times = 1;

private static Stopwatch watch = new Stopwatch();

[MenuItem("CONTEXT/TimeTest/执行")]

private static void Execute() {

watch.Reset();

watch.Start();

float a = 0.1f;

for (int i = 0; i < times; i++) {

FloatAbs2(a);

}

watch.Stop();

print(string.Format("Times: {0} Elaped: {1}", times, watch.Elapsed));

}

// 方法1: Times: 1000000 Elaped: 0.0267839 - 0.0278066

// Mathf.Abs(a)

// 方法2: Times: 1000000 Elaped: 0.0178621 - 0.0181184

public static int IntAbs2(int a) {

return (a ^ (a >> 31)) - (a >> 31);

}

// 方法1: Times: 1000000 Elaped: 0.0277130 - 0.0289079

// Mathf.Abs(a)

// Times: 1000000 Elaped: 0.0207271 - 0.0220157

private static float FloatAbs2(float a) {

return a < 0 ? -a : a;

}

}

官方Mathf部分源码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值