C# 统计代码运行时长

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Sci
{/// <summary>/// 统计代码运行时长(用于记录代码执行耗时信息)/// </summary>public class LogTime{/// <summary>/// 示例/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public static void example(object sender, EventArgs e){LogTime.Start();// 待统计时长的代码...string timeStr = LogTime.CurrentStackTrace();MessageBox.Show(timeStr);LogTime.End("自定义注释信息");     // LogTime.End();}static Dictionary<string, long> timeDic = new Dictionary<string, long>();/// <summary>/// 记录log的开始时间/// </summary>/// <param name="tag"></param>/// <returns></returns>public static void Start(){string key = CurrentMethod(2) + System.Threading.Thread.CurrentThread.ManagedThreadId;  // 获取调用Start()函数的函数名timeDic.Add(key, DateTime.Now.Ticks);                                                   // 记录当前调用时间}/// <summary>/// 记录指定log的结束时间/// </summary>public static void End(string msg = ""){long curTime = DateTime.Now.Ticks;string key = CurrentMethod(2) + System.Threading.Thread.CurrentThread.ManagedThreadId;  // 获取调用End()函数的函数名if (timeDic.ContainsKey(key)){long preTime = timeDic[key];                                                        // 获取Start()函数的调用时间if (msg.Length > 0) msg = "(" + msg + ")";string info = " " + CurrentMethod(2) + msg + " -> 执行耗时: " + getTimeSpan(curTime, preTime);  // 生成耗时信息ThreadPool.QueueUserWorkItem((state) => { Write(info); });                          // 记录至log中timeDic.Remove(key);}}/// <summary>/// 获取调用当前函数的方法名(索引1),/// </summary>/// <returns></returns>public static string CurrentMethod(int index = 1){StackTrace stackTrace = new StackTrace();StackFrame stackFrame = stackTrace.GetFrame(index);return ToString(stackFrame, true);}/// <summary>/// 获取当前调用堆栈信息/// </summary>/// <returns></returns>public static string CurrentStackTrace(){return ToString(new StackTrace());}private static string ToString(StackTrace stackTrace, bool simple = false){StringBuilder sb = new StringBuilder();for (int i = 0; i < stackTrace.FrameCount; i++){StackFrame stackFrame = stackTrace.GetFrame(i);sb.AppendLine(ToString(stackFrame, simple));}return sb.ToString();}private static string ToString(StackFrame stackFrame, bool simple = false){if (simple) return stackFrame.GetMethod() + " ";else return stackFrame.GetFileName() + " -> " + stackFrame.GetMethod() + ",行号:" + stackFrame.GetFileLineNumber() + ",列号:" + stackFrame.GetFileColumnNumber();}static int[] unit = { 1000, 1000, 60, 60, 60, 24, 365 };static string[] unitName = { "微秒", "毫秒", "秒", "分", "时", "天", "年" };/// <summary>/// 获取耗时时长/// </summary>/// <param name="curTime"></param>/// <param name="preTime"></param>/// <returns></returns>private static string getTimeSpan(long curTime, long preTime){long tickSpan = (curTime - preTime) / 10;if (tickSpan < 0) tickSpan = -tickSpan;string timeStr = "";for (int i = 0; i < unit.Length; i++){int unitI = unit[i];if (tickSpan % unitI >= 0) timeStr = (tickSpan % unitI) + unitName[i] + timeStr;if (tickSpan > unitI) tickSpan = tickSpan / unitI;else break;}return timeStr;}/// <summary>/// 向TimeLog中添加信息/// </summary>/// <param name="info"></param>/// <param name="newLine"></param>/// <param name="time"></param>/// <returns></returns>public static bool Write(string info, bool newLine = true, bool time = true){try{string logPath = Application.StartupPath + "\\LogTime";if (!Directory.Exists(logPath)){Directory.CreateDirectory(logPath);}string threadId = System.Threading.Thread.CurrentThread.ManagedThreadId + "";logPath = logPath + "\\" + DateTime.Now.ToString("yyyyMMdd_HH") + ((DateTime.Now.Minute / 5 * 5) + "").PadLeft(2, '0') + "00_" + threadId + ".txt"; // 每5分钟,输出至一个log文件中,不同线程输出至不同文件中string data = info;if (time) data = "[" + DateTime.Now.ToString("HH:mm:ss") + "] " + data;if (newLine) data = "\r\n" + data;File.AppendAllText(logPath, data, Encoding.Unicode);return true;}catch (Exception){return false;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/691107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在计算机上安装两个系统并引导?这里有详细步骤

序言 大多数计算机附带一个操作系统&#xff0c;但你可以在一台电脑上安装多个操作系统。安装两个操作系统&#xff0c;并在启动时在它们之间进行选择。 谷歌和微软终止了英特尔的双启动Windows和Android PC计划&#xff0c;但你可以在安装Windows 7的同时安装Windows 8.1&am…

673. 最长递增子序列的个数(Leetcode)

文章目录 前言一、题目描述二、解题步骤1.小demo介绍2.动态规划1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值 三、代码编写总结 前言 在本篇文章中&#xff0c;我们将会讲到leetcode中673. 最长递增子序列的个数&#xff0c;我们将会用动态规划方式解决这道问题&#…

Star-CCM+绘制网格-全局网格定义(网格类型选择、薄体网格、网格重置)

前言 绘制网格是有限体积法仿真中必不可少的环节。目前Star-CCM+新版本(2304版)导入面网格只可以导入到部件中。网格类型也只能在操作中完成。零部件导入部件后,选中参与计算的全部部件→右键选择“将部件分配给区域”。此处需要注意的是,只有分配给区域后的部件才能进行网…

HNCTF-PWN

1.ez_pwn 直接看危险函数&#xff0c;不能溢出&#xff0c;只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移&#xff0c;通过printf打印出ebp&#xff0c;通过偏移计算出栈地址。 通过gdb调试&#xff0c;偏移是0x38 以下是payload&#xff1a; from pwn import * #i…

HR人才测评,表达能力与岗位胜任力素质测评

什么是表达能力&#xff1f; 表达能力指的就是在语言能力基础之上发展形成的一种语用能力&#xff0c;可以结合自己所掌握的语言来实现交际的目的&#xff0c;能正确且灵活的把语言材料组合成为语言并且表达出想要表达的内容。 在百度百科中有如此定义&#xff0c;表达能力…

每日两题 / 101. 对称二叉树 230. 二叉搜索树中第K小的元素(LeetCode热题100)

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 用两个指针同时遍历树的左右子树即可 每次遍历时&#xff0c;一个指针向左&#xff0c;另一个就要向右。一个向右&#xff0c;另一个就要向左 /*** Definition for a binary tree node.* struct TreeNode {* in…

其他的 框架安全:Apache Shiro 漏洞序列.(CVE-2016-2807)

什么是 Apache Shiro Apache Shiro 是一个强大且易用的Java安全框架&#xff0c;它为应用程序提供了身份验证、授权、加密和会话管理等常见的安全功能。漏洞大多会发生在登录处&#xff0c;返回包里包含remeberMedeleteMe字段.&#xff08; Shiro 这个属于第三方的&#xff0c…

LLM一些适合小白的入门项目和视频

AIX 大模型专区学习&#xff08;史上最丰富&#x1f973;&#xff09; https://github.com/stay-leave/enhance_llm 图谱大哥五一写得。 【对于卷积神经网络&#xff0c;硕士博士不需要搞明白原理&#xff0c;只要会应用是这样吗&#xff1f;-pytorch/深度学习/神经网络】 htt…

【系统架构师】-案例篇(一)UML用例图

1、概述 用于表示系统功能需求&#xff0c;以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者&#xff08;Actors&#xff09;&#xff1a;与系统交互的用户或其他系统。用一个人形图标表示。用例&#xff08;Use Cases&#xff09;&#xff1a;系统需要…

【LeetCode:2391. 收集垃圾的最少总时间 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

浅析vue3自定义指令

vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量&#xff0c;vue怎么知道这是一个指令呢&#xff1f; 这是因为约定大于配置&#xff0c;vue3中有这样一个约定&#xff08;截图来自官方文档&#xff09;&#xff1a; 注意这里说的是驼峰命令&#x…

远程点击没反应

目录 todesk远程登录后点击没反应 解决方法&#xff1a; 方法1 快捷键&#xff1a; 方法2 界面点击Ctrl Alt Delete todesk&#xff0c;向日葵远程登录后点击没反应 todesk远程登录后点击没反应 解决方法&#xff1a; 方法1 快捷键&#xff1a; Ctrl Alt Delete 方法…