.net秒表的正确性

时间:2012-08-28 08:27:47

标签: c# .net stopwatch

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

  1. 我们有一个调用Web服务的客户端
  2. 我们在服务层登录带有秒表的网络服务
  3. 我们使用datetime.now.ticks
  4. 记录下层的时间

    第2层只是一个带有2行记录的传递层。

    记录的时间是:

    1. 110 ms
    2. 52125 ms
    3. 125 ms
    4. 我们原本预计2会小于1,但没有api精确到1 ms。

      我们在每个服务电话中创建一个新的秒表,所以这不是旧秒表重新启动的时间。

      任何人都知道我们为什么会得到这些数字?

      修改

      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进行日志记录。

2 个答案:

答案 0 :(得分:3)

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

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

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

我不能评论如何或是否使用WebSphere,但它不会提供比StopWatch更准确的时序,除非它使用API​​来处理其他一些高精度时间源。

答案 1 :(得分:1)

正如我猜测的那样:

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

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

毫秒获得时间跨度的毫秒部分