首页 > 编程语言 >c#耗时及性能监测

c#耗时及性能监测

时间:2023-10-31 15:32:06浏览次数:26  
标签:Console c# 测量 sw 耗时 时间 WriteLine Stopwatch 监测

c#耗时及性能监测

在编程中,我们经常需要测量代码的执行时间,以便评估代码的性能和效率

命名空间 using System.Diagnostics;

字段 字段说明
Frequency 获取以每秒刻度数表示的计时器频率。此字段为只读。
IsHighResolution 指示计时器是否基于高分辨率性能计数器。 此字段为只读。
属性 属性说明
Elapsed 获取当前实例测量得出的总运行时间。
ElapsedMilliseconds 获取当前实例测量得出的总运行时间(以毫秒为单位)。
ElapsedTicks 获取当前实例测量得出的总运行时间(用计时器刻度表示)。
IsRunning 获取一个值,该值表示 Stopwatch 计时器是否正在运行。
方法 方法说明
Equals(Object) 确定指定对象是否等于当前对象。
GetHashCode() 作为默认哈希函数。
GetTimestamp() 获取计时器机制中的当前刻度数。
GetType() 获取当前实例的 Type。
MemberwiseClone() 创建当前 Object 的浅表副本。
Reset() 停止时间间隔测量,并将运行时间重置为零。
Restart() 停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间。
Start() 开始或继续测量某个时间间隔的运行时间。
StartNew() 初始化新的 Stopwatch 实例,将运行时间属性设置为零,然后开始测量运行时间。
Stop() 停止测量某个时间间隔的运行时间。
ToString() 返回表示当前对象的字符串。

基础示例

Stopwatch类相关字段、属性、方法的使用示例,可以参考代码如下,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Stopwatch实例
            Stopwatch sw = new Stopwatch();
            //开始计时
            sw.Start();
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i);
            }
            //停止计时
            sw.Stop();
            Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
            //重置 停止时间间隔测量,并将运行时间重置为0
            sw.Reset();
            Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
            //重启 停止时间间隔测量,并将运行时间重置为0,然后重新开始           测量运行时间
            sw.Restart();
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i);
            }
            sw.Stop();
            //获取当前实例测量得出的总运行时间(以毫秒为单位)
            Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
            //获取当前实例测量得出的总运行时间
            Console.WriteLine("用时:" + sw.Elapsed);
            //获取当前实例测量得出的总运行时间(用计时器刻度表示)。
            Console.WriteLine(sw.ElapsedTicks);
            Console.Read();
            //开始计时
            sw.Start();
            System.Threading.Thread.Sleep(1000);  //耗时操作 测试代码,休眠1000毫秒
            //结束计时
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);     //输出:消耗的毫秒
            Console.WriteLine(sw.Elapsed.ToString());      //输出:时:分:秒

            //重置秒表
            sw.Reset();
            Console.WriteLine("Reset End");
            //再次开始计时,或者直接用**Restart**函数直接重置并开始
            sw.Start();
            System.Threading.Thread.Sleep(1200);
            //第二次计时结束
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            if (Stopwatch.IsHighResolution)
            {
                Console.WriteLine("使用系统的高分辨率性能计数器的计时的操作.");
            }
            else
            {
                Console.WriteLine("使用DateTime类的计时操作.");
            }

            long frequency = Stopwatch.Frequency;
            Console.WriteLine("计时器频率,以滴答/秒为单位 = {0}", frequency);

            long nanosecPerTick = (1000L * 1000L * 1000L) / frequency;
            Console.WriteLine("计时器在{0}纳秒以下范围内准确", nanosecPerTick.ToString());

        }
    }
}

实现测量代码块执行时间的封装

创建MeasureDuration.cs,并实现 IDisposable 接口的

using System;
using System.Diagnostics;

namespace MechTE_480.Util
{
    /// <summary>
    /// 定义了一个名为MeasureDuration的类,用于测量代码的执行时间。该类实现了IDisposable接口,以便在代码块结束时自动释放资源。
    /// </summary>
    public class MeasureDuration : IDisposable
    {
        private readonly Stopwatch _stopwatch;
        private readonly Action<TimeSpan> _callback;

        /// <summary>
        /// 构造函数接受一个Action&lt;TimeSpan&gt;类型的回调函数作为参数。在构造函数中,我们将回调函数赋值给私有字段_callback,并使用Stopwatch.StartNew()方法启动一个新的计时器。
        /// </summary>
        /// <param name="callback"></param>
        public MeasureDuration(Action<TimeSpan> callback)
        {
            _callback = callback;
            _stopwatch = Stopwatch.StartNew();
        }

        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            _stopwatch.Stop();
            _callback(_stopwatch.Elapsed);
        }
    }
}

在单元测试中使用 MeasureDuration 类来测量代码块的执行时间

[Fact]
public void Duration()
{
    using(new MeasureDuration(duration => _msg.WriteLine($ "代码执行时间:{duration}")))
    {
        // 在这里编写需要测量执行时间的代码
        for(int i = 0; i < 10; i++)
        {
            // 一些耗时的操作
            Thread.Sleep(1000);
        }
    }
}

使用了using语句来创建一个MeasureDuration对象,并在代码块结束时自动释放资源。在MeasureDuration的构造函数中,我们传入了一个回调函数,该函数将在代码块结束时被调用,并将代码执行的时间间隔作为参数传递给回调函数。在回调函数中,我们将代码执行的时间间隔输出到控制台。

标签:Console,c#,测量,sw,耗时,时间,WriteLine,Stopwatch,监测
From: https://blog.51cto.com/u_12828212/8107057

相关文章

  • C#设置DockPanelSuit布局
    1、下载Nuget包,并安装 2、工具箱中拖入如下两个工具到界面 3、设置DockPanelSuite属性 4、更改子窗体代码,若Form2为子窗体,则将其继承Form改为DockContent 5、实现Form2每次显示在Form1内,可以更改DockState实现设置停靠位置  6、同Form2一样,再设置Form3 7、......
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限
    多模态对比语言图像预训练CLIP:打破语言与视觉的界限一种基于多模态(图像、文本)对比训练的神经网络。它可以在给定图像的情况下,使用自然语言来预测最相关的文本片段,而无需为特定任务进行优化。CLIP的设计类似于GPT-2和GPT-3,具备出色的零射击能力,可以应用于多种多模态任务。多模态......
  • 【Python微信机器人】第三篇:使用ctypes调用进程函数和读取内存结构体
    目录修整目前的系列目录(后面会根据实际情况变动):在windows11上编译python将python注入到其他进程并运行注入Python并使用ctypes主动调用进程内的函数和读取内存结构体使用汇编引擎调用进程内的任意函数利用beaengine反汇编引擎的c接口写一个pyd库,用于实现inlinehook利用......
  • 理解 JavaScript 的 async/await
    1.async和await在干什么任意一个名称都是有意义的,先从字面意思来理解。async是“异步”的简写,而await可以认为是asyncwait的简写。所以应该很好理解async用于申明一个function是异步的,而await用于等待一个异步方法执行完成。另外还有一个很有意思的语法规定,awai......
  • 百度AICA首席AI架构师培养计划第七期毕业,大模型深入产业见成果
    10月28日,由深度学习技术及应用国家工程研究中心与百度联合创办的AICA首席AI架构师培养计划,迎来第7期毕业典礼,88位学员获得AI架构师认证。截至目前,AICA已累计为业界培养了410位产业AI领军人才。同时,AICA第7期毕业学员约有三分之一聚焦大模型产业应用课题并取得先期成果。百度文心......
  • SIP UserAgent (B2BUA client)——pjsip
    1.sipstackspjsip/bell-sip/sofia-sip/libeXosip/librehttps://github.com/staskobzar/sip_stacks_examples 2.sipuseragentandservernetworkarchitecture3. InstallingpjsiponUbuntuhttps://www.pjsip.orgsudoapt-getinstalllibasound2-devLinuxsys......
  • soft Exponential activation function
    全文https://ieeexplore.ieee.org/document/7526959SoftExponentialActivationFunction ASoftExponentialActivationFunctionisaparametricneuronactivationfunctionthatisbasedontheinperpolationoftheidentity,logarithmandexponentialfunctions......
  • ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
    ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑1.Elasticsearch产生背景大规模数据如何检索如:当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1)用什么数据库好?(mysql、oracle、mongodb、hbase…)2)如......
  • [Leetcode] 0111. 二叉树的最小深度
    111.二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。 示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输......
  • 单细胞测序 10x genomics
     单细胞转录组从研究方向看上,发育生物学、免疫、神经生物学、肿瘤是排名靠前的方向,这和我们平时遇到的高频研究方向基本吻合。另外,作为一个新兴的领域,10X单细胞转录组检测到细胞多,数据庞大,信息复杂,对数据分析带来诸多困难,因此算法类的文章(Computationalmethod)也高达76篇。从物种......