一个.NET开源、轻量级的运行耗时统计库 - MethodTimer

news/2024/11/6 8:48:36/文章来源:https://www.cnblogs.com/Can-daydayup/p/18528659

前言

在.NET开发中,为了准确统计对应方法的执行时间,我们最常用的方式是手动使用 Stopwatch 来显式编写计时逻辑,但是假如你需要大量的使用 Stopwatch 来进行耗时统计的话不利于保持代码的整洁和增加代码的维护成本。

项目介绍

MethodTimer是一个.NET开源、免费(MIT License)、轻量级的运行耗时统计库,用于在编译时自动向指定方法注入计时代码,无需手动编写繁琐的计时逻辑。

创建控制台应用

创建名为:MethodTimerExercise的控制台应用。

安装NuGet

命令安装

PM> Install-Package Fody
PM> Install-Package MethodTimer.Fody

NuGet包管理器安装

搜索Fody安装:

搜索MethodTimer.Fody安装:

快速使用

通过在方法上添加 Time 属性,MethodTimer 会在编译时自动向 TimeMethod 注入计时代码。

        [Time]
        public static void TimeMethod()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine($"输出结果{i}");
            }
        }

使用ILSpy查看编译后的代码

 public static void TimeMethod()
 {
  Stopwatch stopwatch = Stopwatch.StartNew();
  try
  {
   for (int i = 0; i < 100; i++)
   {
    Console.WriteLine($"输出结果{i}");
   }
  }
  finally
  {
   stopwatch.Stop();
   string message = null;
   MethodTimeLogger.Log(MethodBase.GetMethodFromHandle((RuntimeMethodHandle)/*OpCode not supported: LdMemberToken*/, typeof(Program).TypeHandle), stopwatch.Elapsed, message);
  }
 }

耗时拦截器记录两种方法

运行耗时为long(毫秒):

        /// <summary>
        /// 运行耗时为long(毫秒)
        /// </summary>
        public static class MethodTimeLogger1
        {
            public static void Log(MethodBase methodBase, long milliseconds, string message)
            {
                Console.WriteLine($"方法:{methodBase.Name} 耗时:{milliseconds} 毫秒,信息:{message}");
            }
        }

运行耗时为TimeSpan:

        /// <summary>
        /// 运行耗时为TimeSpan
        /// </summary>
        public static class MethodTimeLogger
        {
            public static void Log(MethodBase methodBase, TimeSpan elapsed, string message)
            {
                Console.WriteLine($"方法:{methodBase.Name} 耗时:{elapsed.TotalMilliseconds} 毫秒,信息:{message}");
            }
        }

耗时统计时长输出

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

  • 开源地址:https://github.com/Fody/MethodTimer
  • MethodTimerExercise:https://github.com/YSGStudyHards/DotNetExercises/tree/master/MethodTimerExercise

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

  • GitHub开源地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
  • Gitee开源地址:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

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

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

相关文章

【ERP】Odoo 版本功能对比

社区版企业版OSCG社区增强版用户界面 桌面端 Y Y Y移动端Y 移动端网页控制 隐藏售价与成本Y仓库组与权限隔离Y采购组与权限隔离YOdoo StudioY 工作流/OA审批 Y会计发票 & 收付款YY完全版财务 YY中国本地化财务 Y月末一次成本法 Y项目管理任务YYY时间表 Y 预测 Y 销售管…

PBN飞行程序保护区样例

收集到一个话题,完整的飞行程序保护区是什么样子? 这个话题范围有点大,我尝试从一个具体的内容入手来聊一聊,比如PBN直线进场到直线复飞的完整保护区是什么样子。 先上两张图,完全不考虑转弯的情况下,终端区内PBN保护区是下面的样子:两张图看起来像是在玩“找不同”的游…

一文解秘Rust如何与Java互操作

本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情,而 Java 也可以享受 Rust 语言特性的内存安全,所有权机制,无畏并发。 互操作的典型场景包括:性能优化:利用 Rust…

读数据工程之道:设计和构建健壮的数据系统29分析

分析1. 合作角色 1.1. 数据分析师 1.2. 数据科学家 1.3. MLOps/机器学习工程师 1.4. 业务侧1.4.1. 数据或非技术的利益相关者、经理和高管1.5. 数据工程师更多的是在支持这些利益相关者的工作,不一定对数据的最终使用方式负责 1.6. 数据工程师负责的是产出高质量的数据产品1.6…

SciTech-BigDataAIML-Algorithm-Heuristic启发式- 无向带weight(权重)Graph(图)的最优路线规划算法 : Dijkstra迪杰斯特拉算法

Dijkstra迪杰斯特拉算法 图例:行号 节点 最短距离 前一节点 已访问完全1 A 02 B 2 A T3 C 12 F T4 D 7 B T5 E 8 B T6 F 9 D,E T上表的用法:表格的"第1行"是"起点"; 图例:上表是图上的节点"A"作为起点; 由"终点"起始,用"每一节…

分布式系统架构笔记

概述 能够识别与分布式系统的非功能性需求相关的指标和机制 能够识别和解释在对分布式系统进行建模时使用的各种视点。 能够在设计分布式系统时对架构样式进行适当的选择。 能够实现一个简单的分布式系统,考虑函数外属性。 能够分析架构模型并评估从不同角度呈现的分布式系统模…

【2024.11.05】所谓照片,不过是在时间长河里刻舟求剑罢了

玩摄影一年了,随便瞎写点感受好了 作为模特的感受 想成为一位摄影前就要先练习成为一位模特,这是很有必要的 我觉得九成以上的人难以做到面对镜头时表里如一 在镜头前多少都会紧张,显得不自然 除非是像我一样持续记录自我,已经适应了镜头的存在 而对于模特来说最好的照片是…

Alpha迭代阶段——第七周Scrum Meeting记录

1.Alpha阶段工作内容: 目前是项目调研、设计和游戏系统开发阶段,后续是游戏组件开发阶段。 主要工作为: (1)分析上周Scrum Meeting会议中的不足,总结本周的工作内容和不足,构思下一步的工作内容; (2)探讨游戏关卡的合理性,初步完成游戏关卡设计; (3)初步完成游戏…

19. 使用MySQL之插入数据

1. 数据插入 顾名思义,INSERT是用来插入(或添加)行到数据库表的。插入可以用几种方式使用:插入完整的行;插入行的一部分;插入多行;插入某些查询的结果。补充: 插入及系统安全: 可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句,这将在第28章介绍 2. 插…

看懂 UML 类图

原文:看懂 UML 类图和时序图从一个示例开始 请看以下这个类图,类之间的关系是我们需要关注的:车的类图结构为<<abstract>>,表示车是一个抽象类; 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示; 小汽车为与 SUV 之间也…

linux 中awk命令实现按照 指定的字符对文本进行排序

001、[root@PC1 test1]# ls a.txt [root@PC1 test1]# cat a.txt ## 测试数据,对如下文本按照a、b进行排序输出 01 02b 03 04 05 06a 07 08 09 10b 11 12 13 14b 15 16 17 18a 19 20 [root@PC1 …

游戏关卡设计文档

关卡设计 关卡一:基础逻辑门练习 任务描述:在这个关卡中,学习如何使用基本的逻辑门(AND门和NOT门)来构建一个简单的“非与”逻辑门。 任务过程:理解逻辑门: 学习AND门的工作原理:只有当所有输入都为高电平时,输出才为高电平。 学习NOT门的工作原理:输出总是输入的…