.NET System.Diagnostics.Stopwatch 问题(返回值太低)

2023-12-23

在我的计算机上,秒表返回的值太低。例如,当我指定时为 200 毫秒Thread.Sleep(1000)。该程序应该等待 1 秒。我也测试过ManualResetEvent.WaitOne(1000)并得到相同的结果。框架 2.0 和 3.0 都给出了这种奇怪的行为。我正在运行带有 .NET Framework 3.5 SP1 的 Windows XP SP3。

这是我的测试结果(代码如下):

1000 ms for DateTime.Now.Ticks
0201 ms for Stopwatch.ElapsedTicks
0142 ms for Stopwatch.ElapsedMilliseconds
0139 ms for Stopwatch.ElapsedTicks after Reset
0264 ms for Stopwatch.ElapsedTicks setting ThreadAffinity
0151 ms for Stopwatch.ElapsedTicks setting ProcessorAffinity (and more)
0371 ms for Stopwatch.ElapsedTicks with Syncronized object
Done!

// 程序.cs 文件

class Program
{
    static void Main(string[] args)
    {
        StopWatchTest.Go();
        Console.WriteLine("Done!");
        Console.ReadLine();
    }
}

// StopWatchTest.cs 类

internal static class StopWatchTest
{
    public const int SleepTime = 1000;

    public static void Go()
    {
        #region Test #0 with DateTime.Now.Ticks
        long startTick = DateTime.Now.Ticks;
        Thread.Sleep(SleepTime);
        long stopTick = DateTime.Now.Ticks;
        long elapsedDt = (stopTick - startTick) * 100;
        Display((int)(elapsedDt / 1000 / 1000), "DateTime.Now.Ticks");
        #endregion Test #0 with DateTime.Now.Ticks

        Stopwatch watch = Stopwatch.StartNew();
        long frequency = Stopwatch.Frequency;
        double nanosecPerTick = (1000.0 * 1000.0 * 1000.0) / frequency;

        #region Test #1 with Stopwatch.ElapsedTicks
        startTick = watch.ElapsedTicks;
        Thread.Sleep(SleepTime);
        stopTick = watch.ElapsedTicks;
        double elapsedSw = (stopTick - startTick) * nanosecPerTick;
        Display((int)(elapsedSw / 1000 / 1000), "Stopwatch.ElapsedTicks");
        #endregion Test #1 with Stopwatch.ElapsedTicks

        #region Test #2 with Stopwatch.ElapsedMilliseconds
        startTick = watch.ElapsedMilliseconds;
        Thread.Sleep(SleepTime);
        stopTick = watch.ElapsedMilliseconds;
        Display((int)(stopTick - startTick), "Stopwatch.ElapsedMilliseconds");
        #endregion Test #2 with Stopwatch.ElapsedMilliseconds

        #region Test #3 with Stopwatch.ElapsedTicks after Reset
        watch.Stop();
        watch.Reset();
        watch.Start();
        startTick = watch.ElapsedTicks;
        Thread.Sleep(SleepTime);
        stopTick = watch.ElapsedTicks;
        elapsedSw = (stopTick - startTick) * nanosecPerTick;
        Display((int)(elapsedSw / 1000 / 1000), "Stopwatch.ElapsedTicks after Reset");
        #endregion Test #3 with Stopwatch.ElapsedTicks after Reset

        #region Test #4 with Stopwatch.ElapsedTicks and ThreadAffinity
        Thread.BeginThreadAffinity();
        startTick = watch.ElapsedTicks;
        Thread.Sleep(SleepTime);
        stopTick = watch.ElapsedTicks;
        elapsedSw = (stopTick - startTick) * nanosecPerTick;
        Display((int)(elapsedSw / 1000 / 1000), "Stopwatch.ElapsedTicks setting ThreadAffinity");
        Thread.EndThreadAffinity();
        #endregion Test #4 with Stopwatch.ElapsedTicks and ThreadAffinity

        #region Test #5 with Stopwatch.ElapsedTicks and ProcessorAffinity (and more)
        const int affinity = 0x0001;
        Process proc = Process.GetCurrentProcess();
        proc.ProcessorAffinity = new IntPtr(affinity);
        proc.PriorityClass = ProcessPriorityClass.High;
        ProcessThreadCollection ptc = proc.Threads;
        foreach (ProcessThread pt in ptc)
        {
            pt.IdealProcessor = 0;
            pt.ProcessorAffinity = new IntPtr(affinity);
        }
        Thread.CurrentThread.Priority = ThreadPriority.Highest;

        startTick = watch.ElapsedTicks;
        Thread.Sleep(SleepTime);
        stopTick = watch.ElapsedTicks;
        elapsedSw = (stopTick - startTick) * nanosecPerTick;
        Display((int)(elapsedSw / 1000 / 1000), "Stopwatch.ElapsedTicks setting ProcessorAffinity (and more)");
        #endregion Test #5 with ProcessorAffinity and more

        #region Test #6 with Syncronized object
        elapsedSw = new SyncTimer().Go();
        Display((int)(elapsedSw / 1000 / 1000), "Stopwatch.ElapsedTicks with Syncronized object");
        #endregion Test #6 with Syncronized object
    }

    private static void Display(int milliseconds, string testName)
    {
        Console.WriteLine("{0:0000} ms for {1}", milliseconds, testName);
    }
}

[Synchronization]
internal class SyncTimer : ContextBoundObject
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public double Go()
    {
        Stopwatch.StartNew();
        long frequency = Stopwatch.Frequency;
        double nanosecPerTick = (1000.0 * 1000.0 * 1000.0) / frequency;

        long startTick = Stopwatch.GetTimestamp();
        Thread.Sleep(StopWatchTest.SleepTime);
        long stopTick = Stopwatch.GetTimestamp();
        return (stopTick - startTick) * nanosecPerTick;
    }
}

看看以下链接:

https://connect.microsoft.com/VisualStudio/feedback/details/94083/stopwatch-returns-negative-elapsed-time https://connect.microsoft.com/VisualStudio/feedback/details/94083/stopwatch-returns-negative-elapsed-time

System.Diagnostics.Stopwatch 在 Elapsed... 属性中返回负数 https://stackoverflow.com/questions/1008345/system-diagnostics-stopwatch-returns-negative-numbers-in-elapsed-properties

秒表的准确性似乎存在问题,可能导致它返回负的经过时间,并且时间变化很大。如果您查看 Connect 问题,大多数人都在谈论在虚拟机上看到该问题,这就是我们看到负 Elapsed 值问题的地方。

看着查询性能计数器文档 http://msdn.microsoft.com/en-us/library/ms644904%28VS.85%29.aspx,这似乎意味着由于 BIOS 或硬件抽象层错误,此问题可能会发生在多处理器系统上,但没有提供进一步的信息,也没有具体说明虚拟机。

至于这个问题的解决方案......我在很多谷歌搜索中都没有找到解决方案。您可以忽略小于零的值,这并不理想,但在某些情况下是可行的。但这并不能解决您的问题 - 您如何知道哪些值无效?

希望这会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET System.Diagnostics.Stopwatch 问题(返回值太低) 的相关文章

随机推荐

  • 使用 spring 将枚举的值注入到属性中

    我有一个类似于下面的枚举 public enum MyEnum ABC some string DEF some string GHI another string String value private MyEnum String va
  • 删除 WPF 中 ListView 上的鼠标悬停效果

    我怎样才能摆脱淡蓝色鼠标悬停对我的影响ListView 当我触摸屏幕时 会出现一个浅蓝色选择器 并在我上下滚动时停留在屏幕中间 但以深蓝色突出显示的所选项目不会改变 我猜这是鼠标悬停效果 因为当我使用鼠标时会出现同样的效果 如何解决 我使用
  • 为什么这个会被锁?循环遍历所有行,对重复项执行函数,删除重复行

    当我一次咬掉几百行时 代码可以工作 但当我尝试在 10 000 行上运行它时 代码总是挂在中间的某个地方 代码的作用 查找 A 列中的重复条目 将两行之间的 c d 和 e 列中的值相加 然后删除原始行 有人能想出一种更稳定的方法来做到这一
  • .net ORM 比较 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 display:none 不隐藏 Struts 2 标签,如

    我想知道为什么div标签无法隐藏Struts2标签 我正在使用div它应该隐藏在负载上 并且onChange我正在调用 jQuery 来切换div tag
  • 如何保持 psobject 有序?

    我有以下脚本 它从另一个脚本获取对象并将其转换为 pscustomobject script1 ps1 ViewConnection cinput OutVariable xprtOut Format Table Wrap converti
  • “Where”子句中的动态表达式 - Linq to SQL

    我是 LINQ 的新手 所以我希望这不是一个愚蠢的问题 我有一个在数据网格中显示大量内容的表格 我希望用户能够通过使用网格上方的一些组合框 如搜索栏 来过滤网格 我创建了一个方法 它获取组合框中的文本 并将其放置在 Where 子句中 pu
  • 从 void 函数返回[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从函数返回哪种更正确的方法 void function blah some code OR void function blah some co
  • 如何使用 Chef 菜谱来设置环境变量?

    如何使用 Chef 菜谱来设置环境变量 我需要使用 Chef 食谱设置环境变量 您能提供一个如何实现这一目标的示例吗 如果您需要严格在 Chef 进程内设置环境变量 则可以使用ENV foo bar 因为这是一个 ruby 过程 如果您需要
  • self.tableView.delegate = self Swift

    如果我有一个 UIViewController 并且我在故事板中将 tableView 连接到它 连接 tableview 出口 然后通过连接检查器连接数据源和委托方法 cntrl 拖动到 vc 橙色圆圈图标 我还需要添加self tabl
  • 如何解决没有 xargs -d 的 MacOS X 问题?

    我有以下命令 xargs d n n 8 bash c phpcs element PSR2 1 2 3 4 5 6 7 8 gt 2 2 gt dev null 如果我在 Linux 中运行此命令 它会起作用 如果我尝试在 Mac OSX
  • Apiary:是否可以记录 JSON 响应字段是什么?

    我想记录实际的 JSON 字段本身代表什么 我已经记录了 GET 语句和参数 但这并不能提供给用户的完整文档 那么 在下面的示例中 我将如何添加有关 OtherFields 的注释 支持吗 或者我是否需要在其他地方制作一份配套文档 View
  • GStreamer:将虚拟音轨添加到接收的 rtp 流中

    我正在使用以下命令从 Raspberry 相机启动 RTP 流 raspivid n vf fl t 0 w 640 h 480 b 1200000 fps 20 pf baseline o gst launch 1 0 v fdsrc h
  • 获取 Span 文本的值

    我有一个跨度class span 和一个隐藏字段class dropdown The span文本发生变化 我需要抓取文本并将其设置为隐藏字段值的值 然后我将使用 php 我已经有了 并使用隐藏字段的名称通过电子邮件将文本发送给我 我该怎么
  • 在 .app 运行时触发脚本(AppleScript 或 JXA)?

    我有一个小型计算机实验室 供学生在无人监督的情况下使用 并在网络上连接了打印机 我正在尝试实现一个简单的脚本添加警报对话框 其中包含有关打印机的所有规则 当他们从任意数量的不同应用程序中选择打印时 我需要弹出这些规则 我正在尝试将脚本直接附
  • 禁用 JButton 的空格键触发单击

    JButton 认为按空格键与单击 JButton 相同 假设 JButton 具有焦点 我在这里假设 有没有办法关闭这种行为 让他们忽略按空格键 另外 更一般地说 是否有一种技术可以做到这一点AbstractButtons 您可以通过执行
  • 删除默认构造函数仍然是微不足道的?

    查看标准中普通默认构造函数的定义 如果默认构造函数不是用户提供的并且满足以下条件 则它是微不足道的 它的类没有虚函数 10 3 也没有虚基类 10 1 并且 其类的非静态数据成员没有大括号或等于初始化程序 并且 其类的所有直接基类都有简单的
  • 如果用户有 cookie javascript 如何重定向用户

    我需要知道当用户第一次使用 javascript 访问该页面时如何为他们提供 cookie 然后我需要 cookie 在 1 小时内过期 如果 cookie 仍然存在并且他们尝试在 1 小时结束之前访问该页面 那么它会重定向他们 相关解决方
  • HTML5 视频的图像占位符备用

    我使用以下代码在页面上实现 HTML5 视频
  • .NET System.Diagnostics.Stopwatch 问题(返回值太低)

    在我的计算机上 秒表返回的值太低 例如 当我指定时为 200 毫秒Thread Sleep 1000 该程序应该等待 1 秒 我也测试过ManualResetEvent WaitOne 1000 并得到相同的结果 框架 2 0 和 3 0