在这个示例代码中,我使用一个简单的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的建议操作 尽管它应该一直都是一样的。只要确保你真正有经验并且全心全意地了解所有课程。
答案 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
尝试:
public Class PerformanceTests
{
public Stopwatch SW1 = new Stopwatch();
public Stopwatch SW2 = new Stopwatch();
public string results1 = "", results2 = "";
....
....
//some other variables to use
}