分析多线程代码,采样如何工作

时间:2016-07-29 12:27:24

标签: c++ multithreading visual-studio profiling

我正在使用Visual Studio来配置我的多线程C ++应用程序。 根据我读到的有关采样方法的内容,我理解它会以指定的时间间隔查看处理器以查看正在执行的函数。

我很好奇它如何处理多线程代码。很可能在不同核上的不同线程上一次执行2个或更多个函数。在这种情况下,采样方法是否增加了这两个函数的计数器?我相信这才是实际发生的事情。

这实际上很难从分析报告中获得洞察力。如果在工作线程上执行,则具有大量收集的样本的函数可以在不同的核心(而不是主线程)上执行,并且可能根本不影响应用程序性能。但是,如果它正在切换主线程以执行其工作,那么它应该对性能产生可观察的影响。

有没有更好的方法来分析多线程代码?

2 个答案:

答案 0 :(得分:1)

当采样函数执行时,剖析器通常单独采样每个软件线程。因此,如果你有三个线程,分别执行CPU密集型的foo(),bar()和baz()函数,并且采样频率为100Hz,并且分析会话的持续时间为1s,那么每个将获得100个样本的功能。

一个不错的分析器通常也会为您提供一种通过给定线程过滤数据的方法,这样您就可以看到哪个热点存在于哪个线程中。例如,如果主线程是使用您使用的框架完成UI呈现的地方,主线程上发生的事情可能会有很大的影响。

确定后台线程中完成的计算如何影响应用程序响应性本身就是一个广泛的主题,并且通常是特定于应用程序的。一些模式:

  • 查找主线程被阻止的位置。它可能阻止等待后台计算的结果。
  • 查看主线程是否有任何必须跳过的地方,因为它没有现成的数据。这在UI /渲染处理中是特别常见的 - 如果在需要渲染帧时数据还没有准备好,那么代码没有什么比跳过渲染框架更好的了,因为在UI中导致用户可见的jank。

希望这有帮助。

答案 1 :(得分:1)

  

有没有更好的方法来分析多线程代码?

我总是要问,因为这些不一样
您正在寻找1)什么是花时间,可以纠正以加速应用程序,或2)各种测量,如功能调用计数,CPU自身时间,CPU包含时间,热路径等。 ?

假设答案是1,那么很多人和我使用的方法只是pause the application,如果有必要,可以在Visual Studio IDE下多次使用。 当你这样做时,它会暂停所有线程。 您可以显示每个线程的调用堆栈。这将向您展示它正在等待的内容以及原因。 在暂停的某些部分,一个或多个线程将处于某些计算或某些系统等待或I / O的过程中,您可能认为这是可以避免的。

你可以称之为“穷人的探查者”, 但这是超越探查器输出的方式:

  • 您不必关心问题是在计算或I / O中,还是猜测它是什么,并选择不同的分析方法。无论哪种方式,你都能看到它。

  • 如果你想知道在函数/方法中花费的时间的包含部分,粗略地说,它是函数在堆栈上的样本的一部分。任何代码行都是如此。 如果你想知道独有(自我)分数,那么当函数或代码行位于堆栈的 end 时。

  • 如果你想知道函数A调用函数B花费了多少时间,它是A调用B的样本的一部分。 如果您对通过中间人呼叫B 感兴趣,您还可以看到(没有呼叫图可以告诉您)。

  • 假设堆栈深度为30级,以某些I / O结尾,并且您想知道代码的哪一部分导致它执行此操作,只需扫描堆栈,查看每行代码直到你找到它。 请注意,这可能不是“热门路径”,因为可能有多种方法来获取问题代码。

  • 执行此操作时,您不仅可以查看负责的代码行,还可以检查相关数据变量的值。 剖析师无法向您展示这些;你必须猜测。

  • 它不会浪费你的时间告诉你许多事情问题因为它们占很小的百分比。 (有时人们认为他们只是在寻找小事,比如5%或更少,而做出乐观的假设没有什么比这更大。一个分析师可以导致一个人做出这个假设,因为有了它你不能任何更大的东西。)

  • 它允许您专注于您可以执行某些操作的代码,您的代码,而不是系统代码。

  • 您无需通过时间线寻找感兴趣的时间间隔。 当它让你等待时,你暂停它;任何时候都很难暂停。 所以它会告诉你它为什么让你等待。