前言

在.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. GDB原始函数信息中获取函数名

    示例: kwdbts::Logger::log(kwdbts::_kwdbContext_t*, kwdbts::KwdbModule, kwdbts::LogSeverity, char const ...

  2. java_GUI2

    package GUi;import java.awt.*;public class GuI2 { public static void main(String[] args) { MyFrame n ...

  3. stm32f10x系列学习笔记(三)ADC

    ADC_SampleTime 用途:在ADC通道配置(ADC_RegularChannelConfig)需要传输的参数. 含义:指两个采样阶段之间的延迟周期数,该参数会影响ADC在采样过程中的性能和准 ...

  4. gcc 和 g++ 的区别

    gcc 和 g++ 是 GNU 编译器集合(GNU Compiler Collection,简称 GCC)中的两个不同命令,用于编译 C 和 C++ 代码.尽管它们都属于同一个编译器集合,但在处理 C ...

  5. 【DVWA】搭建安全测试环境

    一.搭建DVWA环境 用docker输入命令: docker run -d --name zc_dvwa -p 8081:80 vulnerables/web-dvwa 安装完成: 输入地址:http ...

  6. VS Code 代码片段指南: 从基础到高级技巧

    前言 " 系列首发于公众号『非同质前端札记』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. 今天咱们来聊聊 VS Code 里的自定义代码片段. 这 ...

  7. Kubernetes-10:Ingress-nginx介绍及演示

    Ingress介绍 Ingress是什么? ingress 是除了 hostport  nodeport  clusterIP以及云环境专有的负载均衡器外的访问方式,官方提供了Nginx ingres ...

  8. 解决auditwheel repair过程rpath被修改的问题

    问题背景 AuditWheel是一个用于修复Python的whl包的工具,例如在这个CyFES开源库中,因为使用到了Cython和CUDA编译动态链接库的技术,方便Python调用.但是在编译CUDA ...

  9. 即构 UIKits 重磅发布!高效开发与自定义UI兼备,打造互动场景新标杆

    即构UIKits上线,新一代场景化实时互动SDK! 即构科技发布了首款面向中小团队的整合型实时互动产品UIKits , 基于场景化最佳实践,整合RTC.IM.直播.美颜等多款产品,打造了音视频通话UI ...

  10. ArgoWorkflow教程(四)---Workflow & 日志归档

    上一篇我们分析了argo-workflow 中的 artifact,包括 artifact-repository 配置以及 Workflow 中如何使用 artifact.本篇主要分析流水线 GC 以 ...