欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自定义一个代码耗时计数工具类

程序员文章站 2022-03-20 09:38:56
当需要知道某段代码到底耗时多少时,使用最最频繁的场景,就是计时开始,计时结束得到耗时时间(通常以毫秒为单位,再转换成秒也是特别容易)。 通常情况下,会使用一个变量记录开始时间,结束时再进行时间运算显示结果,但代码有点多,且时间加减本就不容易(哈哈)。而使用其它工具,得找(哈哈),而且它可能给你个并不 ......

当需要知道某段代码到底耗时多少时,使用最最频繁的场景,就是计时开始,计时结束得到耗时时间(通常以毫秒为单位,再转换成秒也是特别容易)。

通常情况下,会使用一个变量记录开始时间,结束时再进行时间运算显示结果,但代码有点多,且时间加减本就不容易(哈哈)。而使用其它工具,得找(哈哈),而且它可能给你个并不好关联的名字。

那就来自定义一个耗时计数器吧,它有个开始,有个结束,结束时返回耗时计数。关键,这里用一个自己一碰到耗时计数就能想起的名字。

开始定义

于时,有了以下类定义:

/// <summary>
/// 耗时计数器
/// </summary>
public class timeconsumingcounter
{
    // 创建时默认为创建时间,这样不调用 start 也可以
    private datetime _starttime = datetime.now;

    // 计时开始
    public void start()
    {
        _starttime = datetime.now;
    }

    // 计时结束(输出毫秒)
    public long over()
    {
        var timespan = datetime.now - _starttime;
        return convert.toint32(timespan.totalmilliseconds);
    } 
}

来来来,看一下使用方法:

timeconsumingcounter tcc = new timeconsumingcounter();
tcc.start();
for (var i = 0; i < 10000000; i++)
{
}
// 输出耗时计数
debug.write(tcc.over());

稍作扩展

也许毫秒并不能满足我的需要,不想再进行秒分的转换。那就再来个 timespan 的返回吧,它自带转换。

// 取得间隔
public timespan span()
{
    return datetime.now - _starttime;
}

于是输出可以是: debug.write(tcc.span().totalminutes);

其实,还想更直接点,直接告诉我那个过程运行有多少时间吧。

先看看,最终使用的两个示例:
1.示例一

debug.write(
    timeconsumingcounter.timeconsuming(() =>
    {
        for (var i = 0; i < 10000000; i++)
        {
        }
    }).totalmilliseconds
);

2.示例二

private void foo()
{
    for (var i = 0; i < 10000000; i++)
    {
    }
}

// 输出 foo 运行耗时
debug.write(
    timeconsumingcounter.timeconsuming(foo).totalmilliseconds
);

原理其实很简单,为工具类增加一个静态方法,把需要耗时统计的代码以参数的形式传递给它去计时就可以了。这个方法中,使用到了 action,是 c# 的一种委托,可先熟悉下。静态方法如下:

/// <summary>
/// 静态方法,运行指定函数,返回耗时结果
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
public static timespan timeconsuming(action action)
{
    timeconsumingcounter tcc = new timeconsumingcounter();
    action();
    return tcc.span();
}

附完整代码

/// <summary>
/// 耗时计数器
/// </summary>
public class timeconsumingcounter
{
    // 创建时默认为创建时间,这样不调用 start 也可以
    private datetime _starttime = datetime.now;

    // 计时开始
    public void start()
    {
        _starttime = datetime.now;
    }

    // 计时结束(输出毫秒)
    public long over()
    {
        var timespan = datetime.now - _starttime;
        return convert.toint32(timespan.totalmilliseconds);
    }

    // 取得间隔
    public timespan span()
    {
        return datetime.now - _starttime;
    }

    /// <summary>
    /// 静态方法,运行指定函数,返回耗时结果
    /// </summary>
    /// <param name="action"></param>
    /// <returns></returns>
    public static timespan timeconsuming(action action)
    {
        timeconsumingcounter tcc = new timeconsumingcounter();
        action();
        return tcc.span();
    }
}