首页 > 编程语言 >C# 开发技巧 轻松监控方法执行耗时

C# 开发技巧 轻松监控方法执行耗时

时间:2024-07-23 10:31:37浏览次数:8  
标签:Fody MethodTimer C# void 耗时 监控 Console 方法 public

前言

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。

这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调用前后记录时间戳,进而计算出方法的执行时间。

它使用 Fody 插件框架可以无缝集成到项目中,所以向代码中添加性能测量功能变得非常容易。

使用方法

1、安装NuGet包

在Visual Studio中,打开NuGet包管理器,搜索并安装MethodTimer.Fody或者使用命令方式

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

具体操作如下图所示:

2、使用 Time 特性

using MethodTimer;

namespace DemoConsole
{
    internal class Program
    {
        /// <summary>
        /// 程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // 调用示例方法
            new Program().DoSomething();

            Console.WriteLine("测试方法执行结束!!!");

            Console.ReadKey();
        }

        /// <summary>
        /// 示例方法
        /// </summary>
        [Time]
        public void DoSomething()
        {
            Console.WriteLine("测试方法执行时间!!!");
        }
    }
}

Fody是一个.NET的weaving框架,需要确保项目已经启用了Fody,并且在项目属性的"Fody"标签页中添加了MethodTimer模块。

3、执行效果

启动运行程序,可以在输出窗口查看方法的执行耗时,具体如下图所示:

4、其他说明

Time 特性不仅可以加在方法上还可以直接添加到 Class 上,具体如下代码所示:

using MethodTimer;

namespace ConsoleApp3
{
    [Time]
    internal class Program
    {
        /// <summary>
        /// 程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // 调用示例方法
            new Program().DoSomething();

            new Program().ToDoSomething();

            Console.WriteLine("方法执行结束!!!");

            Console.ReadKey();
        }

        /// <summary>
        /// 示例方法1
        /// </summary>
      
        public void DoSomething()
        {
            Console.WriteLine("001——测试执行时间方法!!!");
           
        }
        /// <summary>
        /// 示例方法2
        /// </summary>

        public void ToDoSomething()
        {
            Console.WriteLine("002——测试执行时间方法!!!");

        }
    }
}

运行程序后,可以输出类中每个方法的执行时间。

实际上,在代码中添加了 Time 特性以后,Fody 会自动生成下面的代码

 public class MyClass
 {
        [Time]
        public void DoSomething()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            // 原始方法体
            System.Threading.Thread.Sleep(1000); // 模拟工作

            stopwatch.Stop();

            // 输出或记录执行时间
            Console.WriteLine($"执行时间:{stopwatch.Elapsed.TotalMilliseconds} ms");
        }
 }

5、拦截记录

如果想手动处理日志记录,可以定义一个静态类来拦截日志记录,方法的示例,具体如下代码所示

public static class MethodTimeLogger
{
    public static void Log(MethodBase methodBase, TimeSpan elapsed, string message)
    {
        //Do some logging here
    }
}

生成后的代码

public class MyClass
{
    public void MyMethod()
    {
        var stopwatch = Stopwatch.StartNew();
        try
        {
            Console.WriteLine("Hello");
        }
        finally
        {
            stopwatch.Stop();
            MethodTimeLogger.Log(methodof(MyClass.MyMethod), stopwatch.Elapsed);
        }
    }
}

MethodTimer.Fody是一个非常有用的工具,尤其在性能调优阶段,可以帮助你快速识别出哪些方法是性能瓶颈,从而针对性地进行优化。

主要特点

1、非侵入式

MethodTimer.Fody不需要在源代码中添加额外的计时代码,只需要在项目中添加相应的NuGet包,并在项目属性中做一些配置,就可以自动地为方法添加计时功能。

2、灵活的配置

你可以选择性地对某些方法进行计时,或者排除不想被计时的方法。这通常通过方法的特性或者类的命名空间来进行配置。

3、输出结果多样化

MethodTimer.Fody可以将计时结果输出到不同的地方,如控制台、日志文件或者通过事件追踪(ETW)等方式,这取决于你的配置。

4、性能影响小

尽管MethodTimer.Fody在方法中插入了计时逻辑,但它被设计得尽可能地对性能影响最小,通过精心优化的IL代码插入策略来实现这一点。

总结

MethodTimer.Fody 是一个强大的工具,提供了简便的方式来监控 C# 方法的执行时间,特别适用于需要快速诊断性能问题的场合。

通过其灵活的配置和非侵入性的特性,它可以无缝地融入现有的开发流程中,帮助我们团队提高应用的性能和响应速度。

这个工具特别适合在开发和测试阶段快速识别性能瓶颈,而无需在代码中显式地添加计时代码,可以保持源代码的整齐性和可维护性。

开源地址

https://github.com/Fody/MethodTimer

 

如果觉得这篇文章对你有用,欢迎加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行交流心得,共同成长。

标签:Fody,MethodTimer,C#,void,耗时,监控,Console,方法,public
From: https://www.cnblogs.com/1312mn/p/18317245

相关文章

  • 凤凰项目(Phoenix Project)精要 - 随笔 - 下
    C-30关于我们究竟应该做什么,需要有更多的线索--》步步逼近某个重大的领域更宏观一些,作为全套流程的设计者那样去思考--》着眼于整个工作流,确认约束点的位置,并竭尽所能地运用各种技术和流程知识来确保工作得到有效执行。发现极具潜质的罕见人才,决定关注他的未来并持续......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • SplObserver 和 SplSubject 接口实现观察者模式
    <?phpclassSubjectimplementsSplSubject{private$observers=[];private$state;publicfunctionattach(SplObserver$observer){$this->observers[]=$observer;}publicfunctiondetach(SplObserver$observer){......
  • PyTorch LSTM 模型上的 CrossEntropyLoss,每个时间步一分类
    我正在尝试创建一个LSTM模型来检测时间序列数据中的异常情况。它需要5个输入并产生1个布尔输出(如果检测到异常则为True/False)。异常模式通常连续3-4个时间步长。与大多数LSTM示例不同,它们预测未来数据或对整个数据序列进行分类,我尝试在每个时间步输出True/False检......
  • 我如何为 yolov5 制作 gui,从 pytorch 和 opencv 加载到 tkinker?
    请帮助我,我不明白如何使用yolo和tkinker作为gui来制作用于实时检测的gui。以及如何将边界框从pytorch渲染到tkinker?这里是代码:importtorchfrommatplotlibimportpyplotaspltimportnumpyasnpimportcv2model=torch.hub.load('ultralytics/yolov5......
  • SMU Summer 2024 Contest Round 6
    1.TakandCards原题链接:http://162.14.124.219/contest/1010/problem/B设dp[i][j][k]是在前i个数中选j(j>=1)个数、其和为k的方案总数。第i个数有选与不选2种可能,由此得出转移方程dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k-a[i]](j>=1)查看代码#include<bits/stdc++.h>#de......
  • centos7更换aliyun软件源一键脚本
    centos7更换aliyun软件源centos7更换aliyun软件源一键脚本curl-Ohttps://raw.githubusercontent.com/Yogoshiteyo/aliyun.repo/main/chageyum.sh&&chmod+xchageyum.sh&&./chageyum.shchageyum.sh#!/bin/bashfunctionchyum(){PS3='选择yum源:'......
  • BTC 地址
    比特币地址(BitcoinAddress)是用于接收和发送比特币的唯一标识符,类似于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点:P2PKH地址(Pay-to-PubKey-Hash):以“1”开头。例子:1A1zP1eP......
  • 基于R语言的多指标联合预测ROC曲线分析
    在机器学习领域中,评估分类模型的性能是一个重要的任务,其中,接收者操作特征曲线(ReceiverOperatingCharacteristiccurve,简称ROC曲线)是一种常用的评估指标,用于衡量二分类模型的准确性。首先,我们需要准备一些数据来训练和评估模型,假设我们有一个包含多个特征和一个目标变量的数......
  • 自编译制作docker版本的onlyoffice镜像
    笔记记录自编译制作docker版本的onlyoffice镜像一、环境:1、win11安装Ubuntu20.04.6.LTS2、需要开代理文件参考:https://helpcenter.onlyoffice.com/installation/docs-community-compile.aspx二、准备1、sudoapt-getupdate2、sudoapt-getinstall-ygitpythonopenssh-......