關于Unity C# Mathf.Abs()取絕對值性能測試詳解
前言
之前有人提到過取絕對值時 直接寫三目運算符比用Mathf.Abs()效率高 沒覺得能高太多
今天測了一下 真是不測不知道 一測嚇一跳 直接寫三目運算符比Mathf.Abs()效率高2-3倍
這性能差距有點不太合理啊! 看下源碼發(fā)現(xiàn) 很多Mathf的方法就是多封裝了一層Math里的方法 把double型轉成float型了 即便很簡單得方法也沒有重新實現(xiàn)
官方有點偷懶了 所以性能差距才會這么大 以后要求性能高的地方要注意 老老實實寫一遍 能提升不少性能

測試代碼:
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
/// <summary>
/// 執(zhí)行時間測試
/// 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/執(zhí)行")]
private static void Execute() {
watch = new Stopwatch();
// 數(shù)據(jù)
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);
// 自己實現(xiàn)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);
}
// == 執(zhí)行次數(shù):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部分源碼:


更高性能取絕對值方法:
http://chabaoo.cn/article/159706.htm...
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
- 使用 BenchmarkDotNet 對 C# 代碼進行基準測試
- C#建立測試用例系統(tǒng)的示例代碼
- C#使用base64對字符串進行編碼和解碼的測試
- C#使用String和StringBuilder運行速度測試及各自常用方法簡介
- 詳解C# WebApi 接口測試工具:WebApiTestClient
- c# 插入數(shù)據(jù)效率測試(mongodb)
- 京東聯(lián)盟C#接口測試示例分享
- C#/.Net 中快速批量給SQLite數(shù)據(jù)庫插入測試數(shù)據(jù)
- C#代碼性能測試類(簡單實用)
- C#控制臺下測試多線程的方法
- c#測試反射性能示例
- c#測試本機sql運算速度的代碼示例分享
- C# 單元測試全解析
相關文章
淺析WPF中Binding的數(shù)據(jù)校驗和類型轉換
在WPF開發(fā)中,Binding實現(xiàn)了數(shù)據(jù)在Source和Target之間的傳遞和流通,那在WPF開發(fā)中,如何實現(xiàn)數(shù)據(jù)的校驗和類型轉換呢,下面就跟隨小編一起學習一下吧2024-03-03
C# 將透明圖片的非透明區(qū)域轉換成Region的實例代碼
以下代碼實現(xiàn)將一張帶透明度的png圖片的非透明部分轉換成Region輸出的方法,有需要的朋友可以參考一下2013-10-10
WPF+ASP.NET SignalR實現(xiàn)后臺通知功能的示例代碼
本文以一個簡單示例,簡述如何通過WPF+ASP.NET SignalR實現(xiàn)消息后臺通知以及數(shù)據(jù)的實時刷新,僅供學習分享使用,如有不足之處,還請指正2022-09-09

