繁体   English   中英

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

[英]Profiling multithreaded code, how does sampling work

我正在使用Visual Studio来分析我的多线程C ++应用程序。 从我对采样方法的了解中,我了解到它以指定的时间间隔查看处理器,以查看正在执行的功能。

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

实际上,这使得从概要分析报告中得出见解非常困难。 如果在工作线程上执行,则具有最多收集样本数的函数可能正在不同的内核上(而不是主线程)执行,并且可能根本不影响应用程序性能。 但是,如果要切换主线程来执行其工作,那么它应该会对性能产生明显影响。

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

在对功能执行进行采样时,事件探查器通常分别对每个软件线程进行采样。 因此,如果您有三个线程,分别执行CPU密集型的foo(),bar()和baz()函数,并且采样频率为100Hz,并且分析会话的持续时间为1s,则每个线程将获得100个样本功能。

体面的探查器通常还会为您提供一种通过给定线程过滤数据的方法,以便您可以查看哪个线程单独存在哪些热点。 例如,如果主线程是使用您使用的框架进行UI渲染的位置,那么在主线程上发生的事情可能就很大。

搞清楚在后台线程中进行的计算如何影响应用程序的响应性本身就是一个广泛的话题,并且通常是特定于应用程序的。 一些模式:

  • 查找主线程在哪里被阻塞。 等待后台计算结果可能会阻塞。
  • 查找主线程是否有任何要跳过的地方,因为它没有可用的数据。 这在UI /渲染处理中特别常见-如果在需要渲染帧时数据还没有准备好,则代码没有更好的工作,因为跳过渲染帧会导致UI中用户可见的刺痛。

希望这可以帮助。

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

我总是要问,因为这些不一样
您是在寻找1)占用时钟时间的时间,并且可以对其进行纠正以加快应用程序的速度,还是2)进行各种测量,例如函数调用计数,CPU自用时间,CPU包含时间,热路径等。 ?

假设答案为1,很多人和我使用的方法是在Visual Studio IDE下简单地暂停应用程序 (如果需要,多次)。 当您这样做时,它将暂停所有线程。 您可以显示每个线程的调用堆栈。 这向您显示了它在等待什么,为什么。 在暂停的一小部分中,一个或多个线程将处于某些计算或某些系统等待或您可能认为可以避免的I / O的过程中。

您可以将其称为“穷人的探查器”,但这是探查器输出之外的方法:

  • 您不必担心问题出在计算或I / O中,也不必猜测是什么,然后选择不同的性能分析方法。 无论哪种方式,您都可以看到。

  • 如果您想知道函数/方法所花费的时间的总和,那是函数在堆栈中的样本所占的比例。 任何代码行都一样。 如果您想知道互斥(自)分数,那就是函数或代码行在堆栈的末尾

  • 如果您想知道函数A调用函数B所花费的时间是多少,那是A调用B的样本所占的比例。如果您对A 通过中介调用B感兴趣,则还可以看到(调用图可以告诉您)。

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

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

  • 它不会告诉你很多东西浪费你的时间都没有问题,因为他们把小百分比。 (有时,人们认为他们只是在寻找较小的东西,例如5%或更少,而做出乐观的假设时,没有什么更大的了。探查器可以导致这一假设,因为有了它,您看不到更大的东西。)

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

  • 您无需遍历时间表即可找到感兴趣的时间间隔。 等待它时,您可以暂停它; 很难再暂停它了。 因此它将告诉您为什么它让您等待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM