關于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://www.dbjr.com.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-03C# 將透明圖片的非透明區(qū)域轉換成Region的實例代碼
以下代碼實現(xiàn)將一張帶透明度的png圖片的非透明部分轉換成Region輸出的方法,有需要的朋友可以參考一下2013-10-10WPF+ASP.NET SignalR實現(xiàn)后臺通知功能的示例代碼
本文以一個簡單示例,簡述如何通過WPF+ASP.NET SignalR實現(xiàn)消息后臺通知以及數(shù)據(jù)的實時刷新,僅供學習分享使用,如有不足之處,還請指正2022-09-09