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;
            }
        }

    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何通过iptables配置URL过滤黑名单?

正文共&#xff1a;1555 字 16 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们前面曾经简单介绍过URL过滤功能&#xff08;URL过滤功能了解一下&#xff1f;&#xff09;&#xff0c;并且以H3C VFW为例简单配置了一下URL过滤功能。 首先回顾一下&#xff0c;URL过滤&#…

若依微服务docker-compose 启动

docker-compose 文件 version : 3 services: ruoyi-nacos: container_name: ruoyi-nacos image: nacos/nacos-server build: context: ./nacos environment: - MODEstandalone volumes: - ./nacos/logs/:/home/nacos/logs - ./n…

【linux-IMX6ULL-定时器-GPT-串口配置流程-思路】

目录 1. 定时器配置流程1.1 EPIT定时器简介1.2 定时器1(epit1)的配置流程1.3 配置代码(寄存器版本)1.4 定时器-配合按键消抖1.4.1 实现原理1.4.2 代码实现&#xff08;寄存器版&#xff09; 2. GPT定时器实现高精度延时2.1 延时原理分析2.2 代码实现 3. UART串口配置流程3.1 UA…

Kafka的安装及接入SpringBoot

环境&#xff1a;windows、jdk1.8、springboot2 Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ 1.概述 Kafka 是一种高性能、分布式的消息队列系统&#xff0c;最初由 LinkedIn 公司开发&#xff0c;并于2011年成为 Apache 顶级项目…

Datax数据采集

一、Datax介绍 官网&#xff1a; DataX/introduction.md at master alibaba/DataX GitHub DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、…

# ERROR: node with name “rabbit“ already running on “MS-ITALIJUXHAMJ“ 解决方案

ERROR: node with name “rabbit” already running on “MS-ITALIJUXHAMJ” 解决方案 一、问题描述&#xff1a; 1、启动 rabbitmq-server.bat 服务时&#xff0c;出错 Error 2、查询 rabbitmqctl status 状态时&#xff0c;出错 Error 3、停止 rabbitmqctl stop 服务时&a…

探索人类意识的多样性:从安全感到语感、节奏感的差异

在我们的日常生活中&#xff0c;人类意识表现出多种多样的特点&#xff0c;这些特点往往与个体的天生禀赋和生活经历密切相关。从安全感到语感、节奏感&#xff0c;每个人的表现都有所不同。今天&#xff0c;让我们一起来探索这些差异&#xff0c;感受人类意识的多样性。 首先&…

指针(5)加油吧

指针&#xff08;5&#xff09; 拿冒泡排序来举例&#xff1a; 1 .qsort void qsort (void* base,//base指向待排序数组的首元素的指针size_t num,//base指向数组中元素的个数size_t size,//base指向的数组中的一个元素的大小&#xff0c;单位是字节int(*cmp)(const void*,co…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

类加载机制(双亲委派机制)

文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时&#xff0c;要安装JDK&#xff0c;JDK包含JVM&#xff0c;不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件&#xff0c;该字节码文件通过 JVM 解释器&#xff0c;生…

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下&#xff1a; 有一个薪水表salaries简况如下&#xff1a; 获取每个部门中当前员工薪水最高的相关信息&#xff0c;给出dept_no, emp_no以及其对应的salary&#xff0c;按照部门编号dept_no升序排列&#xff0c;以上例子输出如下: 2、题目…

7.STL_string(详细)

1. 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

校园管理系统,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园管理系统设计实现

目录 一. 前言 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 院校管理员功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身…

[240512] x-cmd 发布 v0.3.6: (se,wkp,ddgo...)x( kimi,gemini,gpt...)

目录 x-cmd 发布 v0.3.6新增了 jina 模块新增了 ddgo 模块新增了 se 模块wkp 模块新增了 writer 模块cosmo 模块 x-cmd 发布 v0.3.6 本次版本的最新引入的功能都是目的为了进一步探索 LLM 的使用。 本版本的改进分为两类&#xff1a;资讯类模块&#xff08;Wikipedia&#xf…

十、Redis内存回收策略和机制

1、Redis的内存回收 在Redis中可以设置key的过期时间&#xff0c;以期可以让Redis回收内存&#xff0c;循环使用。在Redis中有4个命令可以设置Key的过期时间。分别为 expire、pexpire、expireat、pexpireat。 1.1、expire expire key ttl&#xff1a;将key的过期时间设置为tt…

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…

机器学习(1)

目录 1-1.西瓜书 1-2.课程定位 1-3.机器学习 1-4.典型的机器学习过程 1-5.机器学习理论 1-6.基本术语 1-7.归纳偏好 1-8.NFL定理 1-1.西瓜书 建议使用方式 1.初学机器学习的第一本书:通读、速读;细节不懂处略过&#xff0c;了解机器学习的疆域和基本思想&#xff0c;…

龙迅LT8911EXB MIPIDSI/CSI桥接到EDP点屏,支持EDP1.4

龙迅LT8911EXB描述&#xff1a; Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…