1

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

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

直到最近,我只从事单线程的项目,或者线程非常简单的项目(例如:通常一个额外的线程只是为了确保在程序运行时 UI 不会被锁定,或者一旦我用一个单独的线程来处理 .XM 和 .IT 文件音乐,以便主线程可以做所有事情,而另一个内核中的另一个线程可以负责解码这些文件)。

该程序有多个线程,它们不会在相同的任务上进行并行工作,每个线程都有自己完全独立的目的(例如,一个线程专用于处理对操作系统的所有与声音相关的 API 调用)。

我下载了 Microsoft 性能工具,有一个前 Valve 员工的博客解释说他们努力做到这一点,但尽管我什至设法制作了一些配置文件之类的东西,但我并不真正理解我所看到的,它是对我来说只有一堆漂亮的图表(除了 CPU 使用图表,我已经从对单线程应用程序进行基于样本的分析中知道了),那么,我如何找到程序等待某些东西的原因?或者我如何找到它在等待什么?我如何找到哪个线程阻塞了其他线程?

4

2 回答 2

0
  1. Visual Studio性能和诊断中心中的性能向导具有“资源争用数据”分析机制,允许分析线程之间的并发争用,即程序的整体性能如何受到其他线程等待的线程的影响。有关更多详细信息,请参阅博客文章。
  2. PerfView是一个非常强大的分析工具,它允许分析服务线程和任务对程序整体性能的影响。这是可用的PerfView 教程
于 2016-02-13T05:29:14.643 回答
0

我认为是两件事之间的交替:

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

b) 发现加速,这并不意味着衡量,尽管很多人都被告知过。

每次你找到一个加速,你计算结果并再次执行。这就是交替。为了找到加速,我和很多人使用的方法是随机暂停。这个想法是,你让程序在调试器下运行并手动中断它几次。每次,您都会检查每个线程的状态,包括调用堆栈。它非常粗糙,而且非常有效。

这样做的原因是程序可以运行得更快的唯一方法是,如果它正在执行您可以删除的活动,并且如果这样可以节省一定的时间,那么您至少有可能在每次暂停时看到它。无论是执行 I/O、等待某事还是计算,这都有效。它可以看到分析器不会公开的内容,因为它们会生成加速器可以轻松隐藏的摘要

于 2016-01-31T01:56:48.453 回答