Q1:您使用什么工具进行代码分析(分析,而不是基准测试)?
Q2:你让代码运行多长时间(统计:多少时间步长)?
Q3:案例有多大(如果案例适合缓存,求解器会快几个数量级,但我会错过与内存相关的进程)?
这是我如何做的一个例子。
我将基准测试(查看需要多长时间)与分析(确定如何使其更快)分开。分析器是否快速并不重要。重要的是它告诉您要修复什么。
我什至不喜欢“分析”这个词,因为它会让人联想到类似于直方图的图像,其中每个例程都有一个成本栏,或者“瓶颈”,因为它意味着代码中只有一个小地方需要固定的。这两件事都意味着某种时间和统计数据,您认为准确性很重要。为了时间的准确性而放弃洞察力是不值得的。
我使用的方法是随机暂停,这里有完整的案例研究和幻灯片放映。剖析器-瓶颈世界观的一部分是,如果你什么都没找到,就没有什么可找到的,如果你确实找到了一些东西并获得了一定的加速百分比,你就宣布胜利并退出。Profiler 的粉丝几乎从不说他们获得了多少加速,广告只显示人为设计的问题,旨在易于查找。随机暂停会发现问题,无论它们是简单的还是困难的。然后解决一个问题会暴露其他问题,因此可以重复该过程,以获得复合加速。
根据我从众多示例中获得的经验,它是这样进行的:我可以找到一个问题(通过随机暂停)并修复它,从而获得一定百分比的加速,比如 30% 或 1.3 倍。然后我可以再做一次,找到另一个问题并修复它,获得另一个加速,也许不到 30%,也许更多。然后我可以再做一次,多次,直到我真的找不到其他可以解决的问题。最终的加速因子是各个因子的运行乘积,在某些情况下它可以是惊人的大——数量级。
插入:只是为了说明最后一点。这里有一个详细的示例,带有幻灯片和所有文件,展示了如何在一系列问题消除中实现 730 倍的加速。第一个版本每个工作单位需要 2700 微秒。问题 A 被删除,将时间缩短到 1800,并将剩余问题的百分比放大 1.5 倍 (2700/1800)。然后B被删除。这个过程持续了六次迭代,导致几乎 3 个数量级的加速。但是剖析技术必须非常有效,因为如果没有发现任何这些问题,即如果您达到了错误地认为无能为力的地步,那么该过程就会停止。
插入:换句话说,这是一个总加速因子的图表,因为连续的问题被消除了:
因此,对于 Q1,基准测试一个简单的计时器就足够了。对于“分析”,我使用随机暂停。
Q2:我给它足够的工作量(或者只是在它周围放一个循环),让它运行足够长的时间来暂停。
Q3:无论如何,给它实际的大工作量,这样你就不会错过缓存问题。这些将在执行内存提取的代码中显示为示例。