如何编写通用代码以获取c#中方法执行所花费的时间

时间:2013-05-20 10:55:20

标签: c#

我需要记录企业服务器应用程序中各种方法,代码块所花费的时间 我现在使用秒表,示例代码我已实现如下:

var sw = new Stopwatch();
sw.Start();
DoSomething();
sw.Stop();
logManager.LogInformation(String.Format("Time taken by DoSomething function is {0} ms.", sw.ElapsedMilliseconds));

我在许多.cs文件的许多地方写这样的文字,我只是想通过编写一种常用的方法或扩展来减少这种手工工作来测量所用的时间。为此,我想用时间测量方法包装我的实际方法,如:

long elapsedMilliseconds = ExecuteAndGetTimeTaken(this.DoSomething());

或者像

这样的通用扩展方法
long elapsedMilliseconds = this.DoSomething().GetTimeTaken();

如果方法记录时间太长,那将是很好的。

long elapsedMilliseconds = ExecuteAndGetTimeTaken(this.DoSomething(),logManager,message);

如何编写通用的类/方法或扩展来解决目的?

2 个答案:

答案 0 :(得分:6)

这应该做:

void ExecuteAndMeasureTimeTaken(Action action, string message)
{
    if(action == null) throw new ArgumentNullException();
    else
    {
        var sw = new Stopwatch();
        sw.Start();

        action();

        sw.Stop(); 

        LogMessage(message , sw.ElapsedMilliseconds);
    }
}

这样称呼:

logManager.ExecuteAndMeasureTimeTaken(() => GC.Collect(), "Time taken by GC after each Listning is {0} ms.");

Doest它真的需要一个LogManager参数吗?

如果是这样,您可以将其添加到LogManager本身。

答案 1 :(得分:2)

我创建了一个短类,可以在using语句中使用。 另一个优点是,如果抛出异常,也会测量时间

/// <summary>
/// Provides a easy to use timer. 
/// Usage
/// using(new DiagnosticTimer())
/// {
///     // do anything
/// }
/// </summary>
public class DiagnosticTimer : IDisposable
{
    public System.Diagnostics.Stopwatch StopWatch { get; protected set; }
    public string Message { get; set; }

    public DiagnosticTimer()
    {
        Message = "Diagnostic Timer at " + new System.Diagnostics.StackTrace().GetFrame(1).ToString();
        StopWatch = new System.Diagnostics.Stopwatch();
        StopWatch.Start();
    }
    public DiagnosticTimer(string Message)
    {
        this.Message = Message;
        StopWatch = new System.Diagnostics.Stopwatch();
        StopWatch.Start();
    }

    public void Dispose()
    {
        StopWatch.Stop();
        System.Diagnostics.Trace.WriteLine(Message + StopWatch.Elapsed.ToString());
    }

}