使用StopWatch类进行性能测试的Helper类

时间:2012-12-03 10:49:04

标签: c# .net stopwatch

在这个示例代码中,我使用一个简单的StopWatch来测试完成给定任务/操作所需的时间

StopWatch SW1 = new StopWatch();
SW1.Start();
SomeAction();
SW1.Stop();
sting results = SW1.Elapsed.ToString();
MessageBox.Show(resutls);

我希望有一个我将实例化的类用于测试

public Class PerformanceTests
{
   public StopWatch SW1 = new StopWatch();
   public StopWatch SW2 = new StopWatch();
   public string results1 = "", results2 = "";
   ....
   ....
   //some other variables to use 
}

虽然在实例化类并尝试使用SW1时不允许我使用它的方法。我做错了什么?

PerformanceTests Ptst = new PerformanceTests();
Ptst.SW1. ... Start() is not accessible

更新

对于其他答案,请不要复制我的代码,因为我错过了大写stopwatch。而不是实例化秒表类,我不小心注意Visual Studio是否要为我所谓的秒表而不是.NET的真实Stopwatch创建一个类。

所以我的建议,注意Visual Studio intellisense的建议操作 尽管它应该一直都是一样的。只要确保你真正有经验并且全心全意地了解所有课程。

3 个答案:

答案 0 :(得分:21)

这是一个简单的类,它可以帮助您测量代码块执行的时间:

public class PerformanceTester : IDisposable
{
    private Stopwatch _stopwatch = new Stopwatch();
    private Action<TimeSpan> _callback;

    public PerformanceTester()
    {
        _stopwatch.Start();
    }

    public PerformanceTester(Action<TimeSpan> callback) : this()
    {
        _callback = callback;            
    }

    public static PerformanceTester Start(Action<TimeSpan> callback)
    {
        return new PerformanceTester(callback);
    }

    public void Dispose()
    {
        _stopwatch.Stop();
        if (_callback != null)
            _callback(Result);
    }

    public TimeSpan Result
    {
        get { return _stopwatch.Elapsed; }
    }
}

用法(仅使用PerformanceTester包装代码块):

using (var tester = new PerformanceTester())
{
    // code to test
    MessageBox.Show(tester.Results.ToString());
}

如果您在using阻止之前声明测试人员变量,那么当您退出using阻止时,秒表将自动停止,并且结果可供您使用:

PerformanceTester tester;

using (tester = new PerformanceTester())    
    SomeAction();

MessageBox.Show(tester.Results.ToString());

如果将回调操作传递给PerformanceTester,则会在using语句结束时调用此操作,并将经过的时间传递给回调:

using (PerformanceTester.Start(ts => MessageBox.Show(ts.ToString())))
     SomeAction();

您可以声明方法,该方法将接受TimeSpan并处理结果:

private void ProcessResult(TimeSpan span)
{
   // log, show, etc
   MessageBox.Show(span.ToString());
}

用法变得非常干净:

using (PerformanceTester.Start(ProcessResult))
     SomeAction();

答案 1 :(得分:1)

将它们公开而不是私密:

 public class PerformanceTests
    {
        public StopWatch SW1 { get; set; }

        public StopWatch SW2 { get; set; }

        public string Results1 { get; set; }

        public string Results2 { get; set; }

        public PerformanceTests()
        {
            this.SW1 = new StopWatch();
            this.SW2 = new StopWatch();
        }
    }

答案 2 :(得分:0)

除非您使用自定义类,否则StopWatch不是正确的类名,请在命名空间System.Diagnostics

下尝试Stopwatch

尝试:

public Class PerformanceTests
{
   public Stopwatch SW1 = new Stopwatch();
   public Stopwatch SW2 = new Stopwatch();
   public string results1 = "", results2 = "";
   ....
   ....
   //some other variables to use 
}