前言

写的屎山被同事说了。。

检测一段代码的性能开销

方法1

GPT老师给出了这段模板代码

    void Start()
    {
        // 创建 Stopwatch 实例
        Stopwatch stopwatch = new Stopwatch();

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

        // 在这里放置你要测试执行时间的代码段
        YourCodeToMeasure();

        // 停止计时
        stopwatch.Stop();

        // 获取经过的时间
        TimeSpan elapsedTime = stopwatch.Elapsed;

        // 打印执行时间到控制台
        UnityEngine.Debug.Log("代码执行时间: " + elapsedTime);
    }

    void YourCodeToMeasure()
    {
        // 这里放置你要测试执行时间的代码
        // 例如:一个循环,一个函数,或者其他代码块
        for (int i = 0; i < 1000000; i++)
        {
            // 你的代码
        }
    }

用的是.NET的System.Diagnostics的Stopwatch类。

https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=netcore-2.2

方法2

看到网上还有一个方法是用unity自带的性能分析工具profile进行检测。

Profiler.BeginSample("TestName");
// the code to test
Profiler.EndSample();

Profiler.BeginSample("");这个方法里,自己添加一个自定义label,然后就可以在unity的profile里看到对应的监控。
image

https://docs.unity3d.com/cn/2020.2/Manual/ProfilerWindow.html

屎山分析

需求背景

有一个教学内容,里面分为不同的章节,每一章节有10~100张ppt不等,因为有些章节有上百页ppt,我想做一个次级标题,方便更快速的定位对应内容。

实现

这个需求要实现起来非常简单,只需要对每个要标记为次级标题的ppt标上对应的名称,然后再遍历一遍整个章节的ppt标记上对应的跳转页码。
但是我考虑到如果要在程序加载的时候,每次都要去遍历标题是不是比较消耗性能,于是我写了一个脚本把遍历好的数据结构储存为一个JSON文件。当程序开始加载的时候只需要读取JSON文件就可以了(空间换时间!赢!)

思维漏洞

虽然确实是省去了每次初始化遍历的时间消耗,但是因为其实对于很少量的ppt来说(没有上千),遍历的时间开销要比从硬盘加载读取JSON资源的时间短。

总结

时间换空间还需要考虑到IO读写速度,因此存内存才是最好的选择。

Q.E.D.


寄蜉蝣于天地,渺沧海之一粟