自定義一個代碼耗時計數工具類

當須要知道某段代碼到底耗時多少時,使用最最頻繁的場景,就是計時開始,計時結束獲得耗時時間(一般以毫秒爲單位,再轉換成秒也是特別容易)。函數

一般狀況下,會使用一個變量記錄開始時間,結束時再進行時間運算顯示結果,但代碼有點多,且時間加減本就不容易(哈哈)。而使用其它工具,得找(哈哈),並且它可能給你個並很差關聯的名字。工具

那就來自定義一個耗時計數器吧,它有個開始,有個結束,結束時返回耗時計數。關鍵,這裏用一個本身一碰到耗時計數就能想起的名字。spa

開始定義

於時,有了如下類定義:code

/// <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);
    } 
}

來來來,看一下使用方法:it

TimeConsumingCounter tcc = new TimeConsumingCounter();
tcc.Start();
for (var i = 0; i < 10000000; i++)
{
}
// 輸出耗時計數
Debug.Write(tcc.Over());

稍做擴展

也許毫秒並不能知足個人須要,不想再進行秒分的轉換。那就再來個 TimeSpan 的返回吧,它自帶轉換。io

// 取得間隔
public TimeSpan Span()
{
    return DateTime.Now - _StartTime;
}

因而輸出能夠是: Debug.Write(tcc.Span().TotalMinutes);class

其實,還想更直接點,直接告訴我那個過程運行有多少時間吧。變量

先看看,最終使用的兩個示例:
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();
    }
}
相關文章
相關標籤/搜索