怎样才能最准确地看到某个东西(例如一个方法调用)在代码中花费了多长时间?
我猜最简单和最快的方法是:
DateTime start = DateTime.Now;
{
// Do some work
}
TimeSpan timeItTook = DateTime.Now - start;
但这有多精确呢?有没有更好的办法?
怎样才能最准确地看到某个东西(例如一个方法调用)在代码中花费了多长时间?
我猜最简单和最快的方法是:
DateTime start = DateTime.Now;
{
// Do some work
}
TimeSpan timeItTook = DateTime.Now - start;
但这有多精确呢?有没有更好的办法?
当前回答
秒表是好的,但循环工作10^6次,然后除以10^6。 你会得到更精确的结果。
其他回答
使用Stopwatch类
更好的方法是使用Stopwatch类:
using System.Diagnostics;
// ...
Stopwatch sw = new Stopwatch();
sw.Start();
// ...
sw.Stop();
Console.WriteLine("Elapsed={0}",sw.Elapsed);
我用这个:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUrl);
System.Diagnostics.Stopwatch timer = new Stopwatch();
timer.Start();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
statusCode = response.StatusCode.ToString();
response.Close();
timer.Stop();
stopwatch就是为这个任务设计的。
正如其他人所说,秒表是一个很好的课程使用这里。你可以用一个有用的方法来包装它:
public static TimeSpan Time(Action action)
{
Stopwatch stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.Elapsed;
}
(注意Stopwatch.StartNew()的使用。我更喜欢这样创建一个秒表,然后调用Start()在简单性方面。)显然,这会引起调用委托的冲击,但在绝大多数情况下,这是无关紧要的。你可以这样写:
TimeSpan time = StopwatchUtil.Time(() =>
{
// Do some work
});
你甚至可以为此制作一个ITimer接口,在可用的地方使用StopwatchTimer, CpuTimer等实现。