问答中心分类: C#DateTime.Now 是衡量函数性能的最佳方法吗?
0
匿名用户 提问 41分钟 前

关闭.这个问题是基于意见的.它目前不接受答案。

想改进这个问题?更新问题,以便可以用事实和引用来回答编辑这篇文章.

关闭2年前.

改进这个问题

我需要找到一个瓶颈,并且需要尽可能准确地测量时间。
以下代码片段是衡量性能的最佳方法吗?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
Jonathan C Dickinson 回复 41分钟 前

顺便说一句,如果您不是在寻找快速而肮脏的性能计数器,则可以使用。

Jonathan C Dickinson 回复 41分钟 前

如果您需要更高的精度,请使用 Stopwatch.GetTimestamp,否则答案很好。

Jonathan C Dickinson 回复 41分钟 前

@dbasnett你能详细回答一下吗?

Jonathan C Dickinson 回复 41分钟 前

在上面的示例中,将 start 和 endtime 更改为 long 并将 Stopwatch.GetTimestamp 分配给它们而不是 DateTime.Now。所用时间为(结束-开始)/Stopwatch.Frequency。

Jonathan C Dickinson 回复 41分钟 前

也可以看看:反对 DateTime.Now 的案例

Jonathan C Dickinson 回复 41分钟 前

任何时候你会使用 DateTime.Now,问问你是否不应该使用 DateTime.UtcNow。话虽如此,秒表是正确的解决方案。

Jonathan C Dickinson 回复 41分钟 前

“最好”是主观的。这个问题需要客观地定义什么是“最好”。

15 Answers
0
mmcdole 回答 41分钟 前

如果您想要快速而肮脏的东西,我建议您使用秒表来获得更高的精度。

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

或者,如果您需要更复杂的东西,您可能应该考虑使用 3rd 方分析器,例如蚂蚁.

0
Valentin Kuzub 回答 41分钟 前

本文说首先你需要比较三个备选方案,Stopwatch,DateTime.NowDateTime.UtcNow.
它还表明在某些情况下(当性能计数器不存在时)秒表正在使用 DateTime.UtcNow + 一些额外的处理。因此,很明显在这种情况下 DateTime.UtcNow 是最好的选择(因为其他人使用它+一些处理)
然而,事实证明,计数器几乎总是存在 – 见关于高分辨率性能计数器及其与 .NET 秒表相关的存在的说明?.
这是一个性能图表。请注意 UtcNow 与替代方案相比的性能成本有多低:
在此处输入图像描述
X 轴是样本数据大小,Y 轴是样本的相对时间。
一样东西Stopwatch更好的是它提供了更高分辨率的时间测量。另一个是它更多的面向对象性质。但是,创建一个 OO 包装器UtcNow不能太难。

Peter Mortensen 回复 41分钟 前

第一个链接似乎已损坏。

Valentin Kuzub 回复 41分钟 前

坏了是的..时间机器可以显示它我猜。顺便说一句,为什么要编辑“三个”,我相信这里不需要。

0
Anthony Mastrean 回答 41分钟 前

将您的基准测试代码推送到实用程序类/方法中很有用。这StopWatch类不需要Disposed或者Stopped关于错误。所以,最简单的代码time一些行动

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

示例调用代码

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat(“Did action in {0} ms.”, time);
}

这是扩展方法版本

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

和示例调用代码

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat(“Did action in {0} ms.”, time);
}
Henrik 回复 41分钟 前

更好的粒度呢?许多事情在不到一毫秒的时间内发生。

Anthony Mastrean 回复 41分钟 前

然后返回 Elapsed 属性,它是一个 TimeSpan。我只是向你展示模式。享受实现它的乐趣。

nawfal 回复 41分钟 前

返回Elapsed.TotalMilliseconds以获得更高的精度。也看到这个问题stackoverflow.com/questions/8894425/…

0
jsight 回答 41分钟 前

跑表功能会更好(精度更高)。不过,我还建议只下载一个流行的分析器(点追踪蚂蚁是我用得最多的… DotTrace 的免费试用版功能齐全,不像其他一些那样唠叨)。

0
rp. 回答 41分钟 前

使用 System.Diagnostics.Stopwatch 类。

Stopwatch sw = new Stopwatch();
sw.Start();

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.