我如何描述多线程问题?

时间:2016-01-30 20:37:17

标签: multithreading profiling xperf

这是我第一次尝试分析多线程程序。

我怀疑问题是它在等待什么,但我不知道是什么,该程序永远不会达到100%的CPU,GPU,RAM或I / O使用。

直到最近,我还只处理过单线程的项目,或者线程很简单的项目(例如:通常是一个额外的线程,只是为了确保UI在程序运行时没有锁定,或者一旦我做了一个游戏引擎用一个单独的线程来处理.XM和.IT文件音乐,这样主线程可以做任何事情,而另一个核心的另一个线程可以负责解码这些文件。)

这个程序有几个线程,并且它们不对相同的任务进行并行工作,每个线程都有自己完全独立的目的(例如,一个线程专用于处理与OS的所有与声音相关的API调用)。

我下载了Microsoft性能工具,有一个前Valve员工的博客解释说他们可以做到这一点,但是我甚至设法制作了一些配置文件等等,我真的不明白我所看到的,对于我来说,它只是一堆漂亮的图形(除了CPU使用图形,我已经知道在单线程应用程序上进行基于样本的分析),所以,我如何找到程序等待某些东西的原因?或者我如何找到等待的东西?我如何找到阻止其他线程的线程?

2 个答案:

答案 0 :(得分:0)

我看作是两件事之间的交替:

a)测量总时间,你需要的只是某种计时器,

b)发现加速,即使很多人被告知,意味着测量。

每当您找到加速时,您都会对结果进行计时并再次进行。 这是交替。 为了找到加速,我和许多人使用的方法是random pausing。 这个想法是,你让程序在调试器下运行并多次手动中断它。 每次,您都会检查每个线程的状态,包括调用堆栈。 它非常粗糙,非常有效。

这样做的原因是程序可以更快地运行的唯一方法是,如果它正在执行可以删除的活动,并且如果这可以节省一定时间,那么您至少可以在每个时间看到它暂停。 无论是在进行I / O,等待某事还是计算,这都有效。 它会查看分析器不会公开的内容,因为它们会生成summaries from which speedups can easily hide

答案 1 :(得分:0)

  1. Visual Studio中的性能向导Performance and Diagnostics Hub具有“资源争用数据”分析机制,该机制允许分析线程之间的并发争用,即程序的整体性能如何受到等待其他线程的线程的影响。有关详细信息,请参阅this博文。
  2. PerfView是一个功能非常强大的分析工具,可以分析服务线程和任务对程序整体性能的影响。这是PerfView Tutorial可用。