8

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

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的。而不是实例化 Stopwatch 类,我不小心没有注意 Visual Studio 询问我是否想为我所谓的秒表而不是 .NET 的 real 创建一个类Stopwatch

所以我的建议是,请注意 Visual Studio 智能感知的建议操作,即使它应该始终相同。只要确保您真正有经验并熟记所有课程即可。

4

3 回答 3

25

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

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

用法(只需使用 of 包装代码块PerformanceTester):

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

如果你在usingblock 之前声明了 tester 变量,那么当你退出 block 时秒表将自动停止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();
于 2012-12-03T11:01:06.440 回答
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();
        }
    }
于 2012-12-03T11:00:46.643 回答
0

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

尝试:

public Class PerformanceTests
{
   public Stopwatch SW1 = new Stopwatch();
   public Stopwatch SW2 = new Stopwatch();
   public string results1 = "", results2 = "";
   ....
   ....
   //some other variables to use 
}
于 2012-12-03T11:01:21.730 回答