2016-07-29 57 views
0

我正在使用Visual Studio来剖析我的多线程C++应用程序。 从我已阅读的采样方法中,我了解到它以指定的时间间隔查看处理器,以查看正在执行的函数。剖析多线程代码,如何抽样工作

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

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

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

+1

是的。如果线程不影响你的应用程序的性能,那么你做错了,你最好不要使用它们。模为了防止UI冻结而需要异步性,但这不是并发性。找出为什么多线程程序吸泥需要一种不同类型的工具,[并发分析器](https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=-2147217396) 。 –

回答

1

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

一个体面的分析器通常也会给你一个方法来过滤给定的线程的数据,以便你可以看到哪些热点存在于孤立的线程上。例如,如果主线程是使用您所使用的框架完成UI渲染的地方,那么主线程上发生的情况可能会很重要。

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

  • 寻找主线程被阻塞的位置。它可能会阻塞等待后台计算的结果。
  • 查看主线程是否有任何要跳过的操作,因为它没有可用的数据。这对于UI /渲染处理特别常见 - 如果在渲染帧时数据还没有准备好,那么代码没有任何更好的办法可以跳过渲染框架,从而导致用户可见的在UI中跳跃。

希望这会有所帮助。

0

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

我总是要问,因为这些都是不一样
您是否在寻找1)什么是采取挂钟时间,并可能被纠正,以加快应用程序,或2)诸如函数调用计数,CPU自身时间,CPU包含时间,热路径等各种类型的测量?

假设答案是1,许多人和我使用的方法是在Visual Studio IDE下根据需要简单地pause the application多次。 当你这样做,它暂停所有线程。 您可以显示每个线程的调用堆栈。这会告诉你它等待什么,以及为什么。 一个或多个线程将在暂停的一小部分时间内处于某种计算或系统等待或您可能认为可以避免的I/O的过程中。

你可以称之为“穷人的仿形”, 但这里是它如何超越探查输出:

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

  • 如果您想知道在函数/方法中花费的时间的包含分数,粗略地说,它是函数在堆栈上的样本的分数。任何代码行也是如此。 如果您想知道独占(自)分数,那么函数或代码行位于堆栈的端点处。

  • 如果你想知道分数的时间都花在与功能的调用函数B,它是样品的部分如果你是通过中介感兴趣处于呼叫乙其中A调用B. ,你也可以看到(没有调用图可以告诉你)。

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

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

  • 它不会浪费你的时间告诉你很多东西是而不是问题,因为它们占用很小的百分比。 (有时候人们认为他们只是在寻找小的东西,比如5%或者更少的东西,而使玫瑰色的假设没有什么更大的东西。一个探查器可以让人做出这个假设,因为用它你不能看到更大)

  • 它允许你专注于你可以做些什么的代码,你的代码,而不是系统代码。

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