当前位置: 首页 > news >正文

Unity - 带耗时 begin ... end 的耗时统计的Log - TSLog

CSharp Code

// jave.lin 2023/04/21 带 timespan 的日志 (不帶 log hierarchy 结构要求,即: 不带 stack 要求)using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class TSLog
{// ts == time spanpublic class WithTimeSpanLogData{public int idx;public string tag;public TimeSpan timeSpan; // (DateTime)start - (DateTime)endpublic string startDesc;public string endDesc;public DateTime startDateTime;public DateTime endDateTime;public string classNameStart;public int lineStart;public string classNameEnd;public int lineEnd;public static string GetCSVTitle(){return $"编号, 标记, 耗时, 开始描述, 结束描述, 开始时间, 结束时间, 开始文件, 开始行, 结束文件, 结束行\n";}public override string ToString(){return $"{idx}, {tag}, {timeSpan}, {startDesc}, {endDesc}, {startDateTime}, {endDateTime}, {classNameStart}, {lineStart}, {classNameEnd}, {lineEnd}";}}// clog == custom logpublic static void CLog(string content){Debug.Log($"[{DateTime.Now}] {content}");}private static void GetCodeLineNum(out string fileName, out int lineNum){System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(0, true);System.Diagnostics.StackFrame frame = st.GetFrame(st.FrameCount - 1);fileName = frame.GetFileName();lineNum = frame.GetFileLineNumber();}//=== DEMO START ======================private static void Test(){System.Threading.Thread.Sleep(2000);CLog("Test Func Testing with date time Log");}private static void Test2(){System.Threading.Thread.Sleep(1000);CLog("Test2 Func Testing with date time Log");}[MenuItem("实用工具/测试/测试TSLog并写日志结果")]private static void Usage(){var tslog = new TSLog();tslog.Clear();tslog.BeginTag("Test", "开始Test函数,并标记");Test();tslog.EndTag("Test", "结束Test函数,并统计消耗");tslog.BeginTag("Test2", "开始Test2函数,并标记");Test2();tslog.EndTag("Test2", "结束Test2函数,并统计耗时");tslog.WriteTagLogs();/*测试输出:编号, 标记, 耗时, 开始描述, 结束描述, 开始时间, 结束时间, 开始文件, 开始行, 结束文件, 结束行
0, Test, 00:00:02.0112773, 开始Test函数,并标记, 结束Test函数,并统计消耗, 2023/4/21 15:36:10, 2023/4/21 15:36:12, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 73, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 75
1, Test2, 00:00:01.0104517, 开始Test2函数,并标记, 结束Test2函数,并统计耗时, 2023/4/21 15:36:12, 2023/4/21 15:36:13, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 77, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 79* */}//=== DEMO END ======================// WTSL ==> With TimeSpan Logprivate int WTSLDataIDXCounter = 0;private List<WithTimeSpanLogData> logTag_List = new List<WithTimeSpanLogData>();private Dictionary<string, WithTimeSpanLogData> logTag_Dict = new Dictionary<string, WithTimeSpanLogData>();public void Clear(){WTSLDataIDXCounter = 0;logTag_List.Clear();logTag_Dict.Clear();}public void BeginTag(string tag, string description = null){tag = tag.Replace(",", "_");if (description != null)description = description.Replace(",", "_");var alreadyBeginTag = logTag_Dict.TryGetValue(tag, out var data);var nowDateTime = DateTime.Now;if (alreadyBeginTag){Debug.LogWarning($"[{nowDateTime}] W BeginTag : {tag}, but alreadyBeginTag at time : {data}");}else{GetCodeLineNum(out string fileName, out int lineNum);Debug.Log($"[{nowDateTime}] D BeginTag : {tag}");logTag_Dict[tag] = new WithTimeSpanLogData{idx = WTSLDataIDXCounter++,tag = tag,startDesc = description,startDateTime = nowDateTime,classNameStart = fileName,lineStart = lineNum,};}}public void EndTag(string tag, string description = null){tag = tag.Replace(",", "_");if (description != null)description = description.Replace(",", "_");var hasBeginTag = logTag_Dict.TryGetValue(tag, out var data);var nowDateTime = DateTime.Now;if (hasBeginTag){var ts = nowDateTime - data.startDateTime;Debug.Log($"[{nowDateTime}] D EndTag : {tag}, Timespan : {ts}");logTag_Dict.Remove(tag);GetCodeLineNum(out string fileName, out int lineNum);data.endDesc = description;data.endDateTime = nowDateTime;data.classNameEnd = fileName;data.lineEnd = lineNum;data.timeSpan = ts;logTag_List.Add(data);}else{Debug.LogWarning($"[{nowDateTime}] W EndTag : {tag}, have no Timespan");}}public bool WriteTagLogs(){var ret = false;var error = string.Empty;try{using (var streamWriter = new StreamWriter("BuildingTagLogs.csv", false)){// 标题streamWriter.Write(WithTimeSpanLogData.GetCSVTitle());// 内容var list = logTag_List;list.Sort((a, b) => a.idx - b.idx);foreach (var data in list){streamWriter.Write($"{data}\n");}streamWriter.Close();}Debug.Log("WriteTagLogs : BuildingTagLogs.csv Successfully!");ret = true;error = string.Empty;}catch (System.Exception er){ret = false;error = er.ToString();}finally{if (!ret){Debug.LogError($"WriteTagLogs : BuildingTagLogs.csv Failured, error : {error}");}}return ret;}
}

CSV Output

编号, 标记, 耗时, 开始描述, 结束描述, 开始时间, 结束时间, 开始文件, 开始行, 结束文件, 结束行
0, Test, 00:00:02.0112773, 开始Test函数,并标记, 结束Test函数,并统计消耗, 2023/4/21 15:36:10, 2023/4/21 15:36:12, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 73, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 75
1, Test2, 00:00:01.0104517, 开始Test2函数,并标记, 结束Test2函数,并统计耗时, 2023/4/21 15:36:12, 2023/4/21 15:36:13, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 77, C:\SuoguoProject\Client\Assets\Editor\TSLog.cs, 79

在这里插入图片描述

http://www.lryc.cn/news/60618.html

相关文章:

  • Python 智能项目:1~5
  • C++设计模式:面试题精选集
  • 蓝桥 卷“兔”来袭编程竞赛专场-10仿射加密 题解
  • android so库导致的闪退及tombstone分析
  • 图结构基本知识
  • Hibernate 的多种查询方式
  • FreeRTOS 任务调度及相关函数详解(一)
  • 飞桨paddlespeech语音唤醒推理C实现
  • 04-Mysql常用操作
  • TensorFlow 2 和 Keras 高级深度学习:1~5
  • UML类图
  • 【Python】【进阶篇】二十六、Python爬虫的Scrapy爬虫框架
  • PyTorch 深度学习实用指南:6~8
  • 数据湖 Hudi 核心概念
  • 爬虫请求头Content-Length的计算方法
  • Open Inventor 2023.1 Crack
  • 【华为OD机试真题】查找树中元素(查找二叉树节点)(javaC++python)100%通过率
  • 常用设计模式
  • 时序分析 49 -- 贝叶斯时序预测(一)
  • 从传统管理到智慧水务:数字化转型的挑战与机遇
  • ROS学习第十八节——launch文件(详细介绍)
  • javaweb在校大学生贷款管理系统ns08a9
  • 分布式之搜索解决方案es
  • CSDN 编程竞赛四十六期题解
  • Linux——进程
  • 计及氢能的综合能源优化调度研究(Matlab代码实现)
  • 基于Bert的知识库智能问答系统
  • libapparmor非默认目录构建和安装
  • 2023-04-14 算法面试中常见的查找表问题
  • 从TOP25榜单,看半导体之变