【问题标题】:VerySleepy Profiling c++ codeVerySleepy 分析 C++ 代码
【发布时间】:2016-07-09 04:26:01
【问题描述】:

在分析我的代码以找出运行缓慢的原因时,我有 3 个函数显然需要永远占用,这就是非常困的说法。

这些功能是:

ZwDelayExecution    20.460813   20.460813   19.987685   19.987685
MsgWaitForMultipleObjects   20.460813   20.460813   19.987685   19.987685
WaitForSingleObject 20.361805   20.361805   19.890967   19.890967

谁能告诉我这些功能是什么?为什么它们需要这么长时间,以及如何解决它们。

谢谢

【问题讨论】:

  • 你不修复它们。您会发现为什么在您的代码中导致它们被调用。为此你sample the stack。一个样本就足够了。

标签: c++ profiling verysleepy


【解决方案1】:

可能函数用于使 Win32 API 中的线程“休眠”。它们也可能被用作线程同步,所以检查这些东西。

它们占用大量 CPU 时间,因为它们就是为此而设计的。


WaitForSingleObject 函数可以等待以下对象:

  • 更改通知
  • 控制台输入
  • 事件
  • 内存资源通知
  • 互斥体
  • 处理
  • 信号量
  • 线程
  • 等待计时器

所以它可以用于的另一个可能的事情是控制台用户输入等待。


ZwDelayExecution 是 Windows 的内部函数。可以看出它是用来实现Sleep功能的。这是Sleep 函数的调用堆栈,您可以亲眼看到它:

0  ntdll.dll        ZwDelayExecution    
1  kernel32.dll     SleepEx     
2  kernel32.dll     Sleep   

它可能使用汇编低级特性来实现,因此它可以延迟精度为 100ns 的线程。


MsgWaitForMultipleObjects 有一个类似于WaitForSingleObject 的目标。

【讨论】:

    【解决方案2】:

    从名称来看,这 3 个函数似乎都被阻塞了,因此它们需要很长时间,因为它们被设计为这样做,但它们在等待时不应使用任何 CPU。

    【讨论】:

      【解决方案3】:

      第一步应该始终是检查文档:

      不管怎样,这个名字已经暴露了其中的一部分。 “等待”和“延迟”功能应该需要时间。如果你想减少等待时间,你必须找出调用这些函数的原因。

      举个例子:
      如果您启动一个新线程,然后在主线程中等待它完成,您将在 WINAPI 编程中以一种或另一种方式调用WaitForSingleObject。甚至不必是您启动线程 - 它可能是运行时本身。该函数将等待线程完成。因此,在线程完成或发生超时之前,这将需要时间并阻塞WaitForSingleObject 中的程序。这没什么不好,这是预期的行为。

      【讨论】:

        【解决方案4】:

        在您开始放大这些函数之前,您可能首先想确定您的程序遇到了何种类型的缓慢。 Windows 程序有一个或多个线程将大部分时间花在阻塞函数上是很正常的。

        您首先需要确定您的实际关键线程是否受 CPU 限制。在这种情况下,您不想放大那些占用大量时钟时间的函数,而是希望找到那些占用 CPU 时间的函数。

        我没有太多使用 Very Sleepy 的经验,但 IIRC 它是一个采样分析器,它们通常不擅长测量 CPU 使用率。

        只有在您确定您的程序不受 CPU 限制之后,您才应该放大等待很多的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多