IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 测试Unity中常用代码的运行时间:浮点乘除和整形位操作 #性能测试 #*0.5f 和 /2 的区别 -> 正文阅读

[游戏开发]测试Unity中常用代码的运行时间:浮点乘除和整形位操作 #性能测试 #*0.5f 和 /2 的区别

〇、前言

系统自带计时器 -System.Diagnostics.StopWatch- 的使用

System.Diagnostics.StopWatch 的基本使用方法

//引用命名空间
using System.Diagnostics;

//创建一个计时器
Stopwatch timer = new Stopwatch();

//计时开始
timer.Start();

//计时结束
timer.Stop();

//转换成秒形式
decimal second = timer.Elapsed.Ticks * 0.000_000_1m;

//如果要转换成微秒形式:
decimal microSecond =  timer.Elapsed.Ticks * 0.1m;

//在输出面板输出代码所用时间, ":F4"是保留4位小数的意思
Debug.Log($"Takes {second:F4} second");

知识区: 微秒

提示: 接下来所有测试都以以下代码为标准代码块(更详细的见测试代码运行所用时间(一)),并在测试不同内容时进行不同修改:

...
// ==!==(修改区 0) 修改 count 大小
private int count = 100_000;
...

private void OnClicked()
{
    // ==!==(修改区 1) 最初初始化代码块
    ...

    for (int testIndex = -1; testIndex < (n/*测试实验个数(预热和对比区除外)*/ + 1) * 3; ++testIndex)
    {
    	// ==!==(修改区 2) 每次初始化代码块
    	...
    
    	
		int index = Mathf.FloorToInt(testIndex * 0.334f);
		
        Stopwatch timer = new Stopwatch();
        timer.Start();
        switch (index)//每个测试 3 次
        {
            //传统"预热"
            case -1:
                break;

            // case 0 一般都为普通循环(对比区)
            case 0:
                for (int i = 0; i < count; ++i) { }
                break;

            // ==!==(修改区 3) 其他测试代码块
			case 1:
				...
				break;
				
			...
        }

        timer.Stop();
        UnityEngine.Debug.Log($"{index}: Takes -{timer.Elapsed.Ticks}- ticks");

        // ==!==(修改区 4) 结束后进行其余操作的代码块
        ...
    }
}

一、浮点的乘除

修改代码片:

//(修改区 0)
public double testDouble = 114.514;
public float testFloat = 114.514;
public int testMul = 2;

//(修改区 2)
double tempDouble;
float tempFloat;

其中 测试实验个数 n = 4 
//(修改区 3)
//float 除
case 1:
	for (int i = 0; i < count; ++i)
	{
		tempFloat = testFloat / testMul;
	}
	break;
//float 乘
case 2:
	float tempMul_float = 1 / testMul;
	for (int i = 0; i < count; ++i)
	{
		tempFloat = testFloat * tempMul_float;
	}
	break;
//double 除
case 3:
	for (int i = 0; i < count; ++i)
	{
		tempDouble = testDouble / testMul;
	}
	break;
//double 乘
case 4:
	double tempMul_double = 1 / testMul;
	for (int i = 0; i < count; ++i)
	{
		tempDouble = testDouble * tempMul_double;
	}
	break;

为了能够在短时间内把 testMul 所有情况遍历过去,本博客主在开始时循环调用 OnClicked() 方法:
其中 testMul 与实验数据有关

for (testMul = 2; testMul <= 7; ++testMul)
{
	OnClicked();
}

在Unity中多次测试后取稳定值,记录实验数据

testMul 的值\实验编号1234
23126232416752366
33207230416732327
43130229416722310
53208220816762239
63121233416712289
73210234116812213

由上述实验数据可得:

对于单精度浮点数的简单除法,可以使用乘以倒数的方法减少时间消耗;比如num / 2可以改写为num * 0.5f;
而对于双精度浮点数,最好直接用除。

二、int 的乘除与位移

修改以下代码片,并进行测试:

//(修改区 0)
public int testInt = 114514;
public int testMul = 2;

其中 测试实验个数 n = 4 
//(修改区 2) 计算testMul的位数,如果不是2的指数,则不进行位移操作
int tempInt;
int tempMul_int = testMul;
int digit = 0;
bool fullDigit = true;
while (tempMul_int != 1)
{
	if (tempMul_int / 2 * 2 == tempMul_int )
	{ 
		++digit; 
		tempMul_int /= 2; 
	}
	else
	{
		fullDigit = false;
		break;
	}
}

//(修改区 3)
//int 乘
case 1:            
	for (int i = 0; i < count; ++i)
	{
		tempInt = testInt * testMul;
	}
	break;
//int 左移
case 2:            
	if(fullDigit)
		for (int i = 0; i < count; ++i)
		{
			tempInt = testInt << tempMul_int;
		}
	else
	 	continue;
	break;
//int 除
case 3:            
	for (int i = 0; i < count; ++i)
	{
		tempInt = testInt / testMul;
	}
	break;
//int 位操作
case 4:
	if(fullDigit)
		for (int i = 0; i < count; ++i)
		{
			tempInt = testInt >> tempMul_int;
		}
	else
	{
		if (testIndex == max - 1) return;
		continue;
	}
	break;

同上述浮点数乘除的代码,测试 int位移时间消耗 也要在短时间内把 testMul 所有情况遍历过去:

for (testMul = 2; testMul <= 7; ++testMul)
{
	OnClicked();
}

最后在Unity中多次测试后取稳定值,记录实验数据

testMul 的值\实验编号1234
21285177520571786
31286/2056/
41286167920571736
51223/1957/
61223/1957/
71223/1957/
81286177720571707

最后得出实验结论:

对于 int
如果进行运算,用左移是画蛇添足的;
如果进行运算,如果除数是2的指数倍则右移操作会稍稍提升运行速度;
常用于把 num / 2 改成 num>>1

新人博主,请大家多多光照~~如果有什么不正确或不足的地方请在评论区积极指出哟,一起学习一起进步~

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:47:58  更:2021-08-31 15:49:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/16 17:49:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码