如果某件事使单线程程序占用了 10 倍的时间,那么您可以在其上运行分析器。您也可以使用“暂停”按钮停止它,您将确切地看到它在做什么。
即使它只比应有的慢 10%,如果你停止它更多次,不久你就会看到它反复做不必要的事情。通常问题是堆栈中间某处的函数调用并不是真正需要的。这不能衡量问题,但确实可以找到问题。
编辑:反对意见主要假设您只取 1 个样本。如果您是认真的,请取 10。平均而言,任何导致某些百分比浪费(例如 40%)的代码行都会出现在该部分样本的堆栈上。瓶颈(在单线程代码中)无法隐藏。
编辑:为了说明我的意思,许多反对意见的形式是“没有足够的样本,所以你看到的可能完全是虚假的”——关于机会的模糊想法。但是,如果任何可识别的描述(不仅仅是在例程中或例程处于活动状态)在 30% 的时间内有效,那么在任何给定样本上看到它的概率是 30%。
然后假设只取了 10 个样本。问题在 10 个样本中出现的次数服从二项分布,出现 0 次的概率为 0.028。看到它 1 次的概率是 0.121。2 次,概率为 0.233,3 次为 0.267,之后下降。由于看到它少于两次的概率是 0.028 + .121 = .139,这意味着看到它两次或更多次的概率是 1 - .139 = .861。一般规则是,如果您看到可以在两个或更多样本上修复的内容,则值得修复。
在这种情况下,在 10 个样本中看到它的机会是 86%。如果你是那 14% 的人没有看到它,那就多采集一些样本,直到你看到为止。(如果样本数量增加到20个,看到两次或更多次的机会增加到99%以上。)所以它没有被精确测量,但它已经被精确地找到了,理解这一点很重要它很容易成为分析器实际上无法找到的东西,例如涉及数据状态的东西,而不是程序计数器。