【问题标题】:Can a call to WaitHandle.SignalAndWait be ignored for performance profiling purposes?出于性能分析目的,是否可以忽略对 WaitHandle.SignalAndWait 的调用?
【发布时间】:2010-11-05 07:12:23
【问题描述】:

我刚刚下载了ANTS Performance Profiler from Red Gate 的试用版,正在调查我团队的一些代码。我立即注意到 ANTS 报告有一段特定的代码占用了高达 99% 的 CPU 时间。

我完全不熟悉 ANTS 或一般的性能分析(也就是说,除了使用我确信是极其粗略和不受欢迎的方法进行自我分析之外,例如 double timeToComplete = (endTime - startTime).TotalSeconds),所以我仍在摆弄围绕应用程序并弄清楚它是如何使用的。但我确实打电话给负责该代码的开发人员,他的直接反应是“是的,它这么说并不让我感到惊讶;但是该代码调用 SignalAndWait [我可以自己看到,感谢 ANTS],它不使用任何 CPU,它只是坐在那里等待要做的事情。”他建议我直接忽略该代码并寻找我能找到的任何其他内容。

我的问题:SignalAndWait 是否确实不需要 CPU 开销(如果是,这怎么可能?),性能分析器将其视为占用 99% 的 CPU 时间是否合理?我觉得这特别奇怪,因为如果它是 99%,这表明我们的应用程序经常处于空闲状态,不是吗?然而最近它的表现却变得相当低迷。

就像我说的,当谈到这个工具时,我真的只是一个初学者,我对 WaitHandle 类一无所知。因此,任何有助于我了解这里发生的事情的信息都将不胜感激。

【问题讨论】:

    标签: .net performance multithreading profiling waithandle


    【解决方案1】:

    WaitHandle 确实使您的线程进入睡眠状态。

    额外的好处是您可以在这些句柄上设置超时,以便它们可以在一段时间后唤醒。

    您还可以从另一个线程(例如,应用程序退出等)向 WaitHandle 发出信号,它们会立即唤醒。

    我个人更喜欢具有短超时的 WaitHandle,而不是具有相同超时的 Thread.Sleep,因为当启动睡眠时,它必须返回才能恢复操作,而 WaitHandle 可以恢复如果需要,立即。

    【讨论】:

      【解决方案2】:

      我认为您的代码中可能存在严重错误。 EventWaitHandle 有 2 种语义,具体取决于其重置模式。 当 EventWaitHandle 处于 AutoReset 模式时,所有等待线程都被阻塞,直到事件发出信号,一旦事件发出信号,随后对其进行的等待操作将重置其状态并再次调用等待的线程对其进行阻塞。

      但是,如果 EventWaitHandle 处于 ManualReset 模式,它将保持信号状态,直到您对其手动调用 Reset,这意味着如果 EventWaitHandle 信号并且线程在紧密循环中对其调用等待,则该线程将不会阻塞,直到在事件上手动调用 Reset,所以考虑这个假设场景

      EventWaitHandle h1, h2;
      h1 = new EventWaitHandle(true, EventWaitHandle.ManualReset); // the event is already signaled.
      h2 = new EventWaitHandle(false, EventWaitHandle.ManualReset);
      while(true)
      {
        WaitHandle.SignalAndWait(h2,h1);
      }
      

      上面的循环会占用你的大部分 CPU,直到其他线程调用 h1.Reset(),这将导致 SignalAndWait 阻塞。

      希望这会有所帮助。

      欲了解更多信息,请查看 http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        相关资源
        最近更新 更多