【问题标题】:Correctness of .net stopwatch.net 秒表的正确性
【发布时间】:2012-08-28 08:27:47
【问题描述】:

我们正在调试一些性能问题,并注意到秒表的一些奇怪结果。

  1. 我们有一个调用 Web 服务的客户端
  2. 我们使用秒表在服务层 og Web 服务记录时间
  3. 我们用 datetime.now.ticks 在底层记录时间

第 2 层只是具有 2 行日志记录的传递层。

记录的时间是:

  1. 110 毫秒
  2. 52125 毫秒
  3. 125 毫秒

我们曾预计 2 小于 1,尽管没有 api 精确到 1 毫秒。

我们在每个服务调用中创建一个新的秒表,因此这不是旧秒表重新启动的时间。

有人知道我们为什么要得到这些数字吗?

编辑

2 和 3 在同一台机器和同一个应用域上

秒表码是:

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

            //code to call layer 3

            sw.Stop();
            orchestrationContext.LogOperationTime(functionName, sw.ElapsedMilliseconds);

在第 3 层记录时间

    protected DateTime StartTime { get; set; }
    StartTime = DateTime.Now;

    // code 

    new TimeSpan(DateTime.Now.Ticks - StartTime.Ticks).Milliseconds

1 的日志记录在单独的机器上,使用 Websphere 进行日志记录。

【问题讨论】:

  • 给我们看时间计算的代码!我希望那里有错误。例如。毫秒而不是 TotalMilliseconds
  • 你用StopWatch记录时间?您的层不是在不同的应用程序域中运行吗?它们在同一台机器上运行吗?请出示您如何获得这些数字的代码。
  • 第三层的计算应该是new TimeSpan(DateTime.Now - StartTime).TotalMilliseconds
  • 如果您想使用DateTime 进行计时,您应该使用DateTime.UtcNow,而不是DateTime.Now。第二个比第一个慢得多,因为它必须处理时区。
  • @Jodrell: StopWatchDateTime.UtcNow 好,但您只能使用它在单个进程中执行计时。如果您想在多个进程或主机之间执行计时(显然它已在问题中完成),您需要记录时间,我的评论很简单,您应该更喜欢 DateTime.UtcNow 而不是 DateTime.Now

标签: c# .net stopwatch


【解决方案1】:

好的,您的第二个代码示例应该返回 TimeSpan.TotalMilliseconds,仅使用 Milliseconds 您将获得第二部分。

为什么不在第 3 层代码中使用StopWatch,与第 2 层代码的样式相同,更准确?

您的问题标题是“秒表的正确性”,但您似乎正在将香蕉与桃子和苹果进行比较。如果您的硬件或操作系统支持,StopWatch 将使用 HighResolution 计时器,否则它将回退到提供大约 15 毫秒粒度的 System.Timer

我无法评论如何或是否使用 WebSphere,但它不会提供比 StopWatch 更准确的计时,除非它使用 API 来访问其他一些高精度时间源。

【讨论】:

    【解决方案2】:

    如我所料:

    new TimeSpan(DateTime.Now.Ticks - StartTime.Ticks).TotalMilliseconds 
    

    TotalMilliseconds 以毫秒为单位获取时间跨度

    Millisecond 获取时间跨度的毫秒部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多