C# 统计代码运行时长

news2024/12/25 13:49:41

 

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.coloradmin.cn/o/1665732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决“电脑开机黑屏Explorer进程卡死“问题

今天&#xff0c;给台式机按电源键&#xff0c;进入windows系统时&#xff0c;发现电脑黑屏了&#xff0c;昨天还好好的&#xff0c;怎么今天电脑桌面进不去了&#xff1f;想起Windows XP、Windows 7、Windows 10 、Windows 11等系统&#xff0c;在使用多个文件拷贝时&#xff…

部署yolov5

1 创建一个yolov5的环境 conda create -n yolov5 python3.8 2 激活环境 conda activate yolov5 3 设置清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 4 PyTorch 网站下载pytorch 备注:也可以使用pip install 5 下载 yolov5…

嵌入式软件开发离职,准备去创业...

大家好&#xff0c;我是麦鸽&#xff0c;最近有读者提问&#xff0c;嵌入式软件开发离职去创业怎么样&#xff1f; 关于这个问题&#xff0c;我是持中立意见的&#xff0c;但是还是要慎重。下面说说我的看法。 其实咱们搞技术的人都有一个通病&#xff0c;就是把技术看得过于重…

C语言 | Leetcode C语言题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; int largestRectangleArea(int* heights, int heightsSize) {int st[heightsSize];int p[2];p[0]-1,p[1]heightsSize;int size0,result0;st[size]0;for(int i1;i<heightsSize;i){ while(size!0&&heights[i]<heights[st[size-1…

【详细介绍下Visual Studio】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

读天才与算法:人脑与AI的数学思维笔记25_涌现理论

1. 人工智能新闻 1.1. 人工智能新闻报道算法的核心是如何将未经处理的原始数据转换成新闻报道 1.2. 很少有记者为美联社决定使用机器来帮助报道这些新闻持反对意见 1.2.1. 像“Wordsmith”这样的算法&#xff0c;具有自动化的洞察力、科学的叙事能力&#xff0c;现在正被应用…

AI图书推荐:利用生成式AI实现业务流程超自动化

《利用生成式AI实现业务流程超自动化》&#xff08;Hyperautomation with Generative AI&#xff09;这本书探索了广泛的用例和示例&#xff0c;展示了超自动化在不同行业、领域和特定部门的多样化应用&#xff0c; 让您熟悉UiPath、Automation Anywhere和IBM等流行工具和平台&…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit&#xff1a;智能目标检测可视化展示介绍 随着人工智能技术的飞速发展&#xff0c;目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中&#xff0c;YOLOv5以其卓越的性能和实时性&#xff0c;成为了业界的佼佼者。与此同时&#xff…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

im(即时通讯)是什么?

在当今数字化时代&#xff0c;即时通讯&#xff08;IM&#xff09;已经成为企业内部沟通与协作中不可或缺的工具。作为一种实时的即时通讯方式&#xff0c;IM能够极大提高团队成员之间的沟通效率&#xff0c;帮助企业快速响应变化&#xff0c;并增强内部协作与创新能力。 Work…

Linux提权--本地环境变量文件配合 SUID

免责声明:本文仅做技术交流与学习... 目录 背景: 前提条件: 演示: 实战中如何操作? 探针发现: 背景: 环境变量提权--------> 背景&#xff1a; 管理员编译了程序&#xff0c;给予了程序管理员运行的方案, 攻击通过对程序的运行调试反编译等得到了程序的运行大概逻辑, …

【C++11】C++11类与模板语法的完善

目录 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 1-2&#xff0c;强制生成关键字 二&#xff0c;可变参数模板 2-1&#xff0c;模板参数包 2-2&#xff0c;STL容器empalce的相关接口 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 C11之前的类中有…

stable diffusion WebUi本地安装

一、stable diffusion 介绍 Stable Diffusion是一种先进的文本到图像的生成模型&#xff0c;它可以根据给定的文本输入生成高度逼真的图像。 Stable Diffusion模型因其高效性和灵活性&#xff0c;在AI图像生成领域引起了广泛关注&#xff0c;并在实际应用中展示了其强大的能力…

数据结构深入理解--栈

目录 一、栈的定义 二、栈的实现 2.1 栈的结构 2.2 栈的初始化 2.3 栈的销毁 2.3 栈元素的插入 2.4 栈元素的删除 2.5 栈顶元素获取 2.6 栈元素有效个数获取 2.7 栈是否为空判断 三、代码总览 Stack.h Stack.c 测试代码:test.c 四、例题 例一&#xff1a; 例二&#xff…

【比邻智选】MF871U模组

&#x1f680;搭载国产芯&#xff0c;严苛测试&#xff0c;稳定可靠 &#x1f6e0;️R16特性加持&#xff0c;5G LAN&#xff0c;纳秒级精度 &#x1f310;超低成本&#xff0c;丰富协议&#xff0c;连接无界限

《A data independent approach to generate adversarial patches》论文分享(侵删)

原文链接&#xff1a;A data independent approach to generate adversarial patches | Machine Vision and Applications author{Xingyu Zhou and Zhisong Pan and Yexin Duan and Jin Zhang and Shuaihui Wang}, 一、介绍 在图像识别领域&#xff0c;与数字域中的攻击相比…

ZigBee设备入网流程抓包分析(以飞利浦灯泡为例)

1.第一步&#xff0c;网关打开入网许可&#xff0c;广播Pjoin 2.第二步&#xff0c;设备开始扫网&#xff0c;发送Beacon Request 3.第三步&#xff0c;网关收到Beacon Request请求后&#xff0c;应答Beacon数据帧 4.收到可入网的Beacon帧后&#xff0c;发送关联请求&#xff0…

Linux提权--内核漏洞--web用户提权(脏牛)本地提权(脏管道)

免责声明:本文仅做技术交流与学习... 目录 Linux-内核漏洞Web用户提权-探针&利用-脏牛dcow nmap扫描目标IP及端口 导入脚本,进行探针 通过MSF发现目标机器存在脏牛漏洞 ---上传信息搜集的文件,查找漏洞,利用漏洞,继续上传EXP. --密码改了,再用xshell连一下就行了. …

实物仿真平台设计方案:927-8路GMSL视频注入回灌的自动驾驶半实物仿真平台

8路GMSL视频注入回灌的自动驾驶半实物仿真平台 一、平台介绍 产品基于8路GMSL视频注入回灌的自动驾驶半实物仿真平台旨在提高实验室及研究生院师生在基础软件层开发、计算机视觉和深度学习方面的专业知识学习和实践能力&#xff0c;为师生提供一个稳定软件开发和多精度框…

智慧校园的主要功能是什么

随着信息化的发展&#xff0c;智慧校园的应用已经屡见不鲜。智慧校园是新技术与新科技落地的典型案例。智慧校园完善了校园信息化建设体系&#xff0c;推动了教育水平的提升&#xff0c;以下是智慧校园实现的几个比较典型的功能&#xff1a; 1.数字化办公 毋庸置疑&#xff0…