前言

在.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支持。

优秀项目和框架精选

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

一个.NET开源、轻量级的运行耗时统计库 - MethodTimer的更多相关文章

  1. libaco: 一个极速的轻量级 C 非对称协程库 🚀 (10 ns/ctxsw + 一千万协程并发仅耗内存 2.8GB + Github Trending)

    0 Name 简介 libaco - 一个极速的.轻量级.C语言非对称协程库. 这个项目的代号是Arkenstone 

  2. Ptypes一个开源轻量级的c++库,包括对一些I/O操作、网络通信、多线程和异常处理的封装

    C++开源项目入门级:Ptypes    Ptypes一个开源轻量级的c++库,包括对一些I/O操作.网络通信.多线程和异常处理的封装.虽然代码有限,包括的内容不少,麻雀虽小,五脏俱全.    提高: ...

  3. springMVC Aspect AOP 接口耗时统计

    在接口开发中,我们通常需要统计接口耗时,为后续接口性能做统计.在springMVC中可以用它的aop来记录日志. 1.在spring配置文件中开启AOP <!--*************** ...

  4. 一个高性能、轻量级的分布式内存队列系统--beanstalk

    Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...

  5. JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格

    JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...

  6. SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON

    对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信 ...

  7. flexpaper 开源轻量级的在浏览器上显示各种文档的组件

    FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用, 使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持.它可以被当做Flex的库 ...

  8. SQLSERVER读懂语句运行的统计信息

    SQLSERVER读懂语句运行的统计信息 对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行 ...

  9. OAuth的一个.NET开源实现

    从编译DotNetOpenAuth中学到的程序集强签名知识 OAuth的一个.NET开源实现,官方网站:http://dotnetopenauth.net/ . 从GitHub签出DotNetOpen ...

  10. delphi 线程教学第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行

    第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行     以 Ado 为例,常见的方法是拖一个 AdoConnection 在窗口上(或 DataModule 中), 再配合 AdoQ ...

随机推荐

  1. A. Flipping Game

    A. Flipping Game 本质上是让我们找出一段区间内\(0\)的个数大于\(1\)的个数的最多的区间,且必须进行一次操作,所以可以考虑区间\(dp\),或者最小子序列和 1 最小子序列和 \ ...

  2. 存储过程test按钮式灰的

    PL/SQL Developer中,存储过程无法调试的问题解决办法 在Oracle10中新建了一个用户,然后编写存储过程在PL/SQL Developer中调试,提示 ORA-0131: Insuff ...

  3. jxls导入excel

    我们在开发中经常用jxls实现导出功能,殊不知jxls也有导入功能,下面来介绍下如何使用jxls导入excel. 首先在maven的pom中添加相关依赖,如下: <dependency> ...

  4. 什么是ARM中的SP(堆栈)和LR?

    LR是用于保存函数调用的返回地址的link register. SP是堆栈指针.堆栈通常用于在函数调用中保存"automatic"变量和上下文/参数.从概念上讲,您可以将" ...

  5. vscode使用说明

    # 要经常保存 # centos打开vscode方式 普通用户:[bw@localhost ~]$ /usr/share/code/bin/code 超级用户:[root@localhost shar ...

  6. uni-app 小程序用户信息之头像昵称填写

    小程序获取用户头像昵称,微信又叒做妖,废除之前的接口,改成了头像昵称填写 通知:微信小程序端基础库2.27.1及以上版本,wx.getUserProfile 接口被收回,详见<小程序用户头像昵称 ...

  7. vue serve 部署 步骤说明

    1. 构建镜像 docker build -t 镜像名称:镜像TAG --build-arg URL=http://localhost:8081 --build-arg PORT=2000 --bui ...

  8. Postman Code Java-Unirest 代码的依赖

    本来是Postman的Code直接使用的,结果根据这个名字 Unirest,搜出来了很多依赖,使用了排名第一的, https://search.maven.org/search?q=Unirest 结 ...

  9. 如何在 Nuxt 3 中有效使用 TypeScript

    title: 如何在 Nuxt 3 中有效使用 TypeScript date: 2024/9/9 updated: 2024/9/9 author: cmdragon excerpt: 摘要:本文详 ...

  10. 音视频基础知识|ANS 噪声抑制原理解析

    ​ 在上一期课程<音视频开发进阶课程|第二讲:回声消除>中,我们接触了音频前处理的概念,还认识了音频前处理的三剑客之一 AEC 回声消除.今天,我们继续来认识三剑客中的第二位:噪声抑制 A ...