代码之家  ›  专栏  ›  技术社区  ›  Satbir

比较不同版本库性能的最佳方法

  •  1
  • Satbir  · 技术社区  · 15 年前

    目前,对于库中的每个调用,我正在进行多次迭代,测量每个调用所用的时间,然后计算:

    1. 每次通话的平均时间
    2. 最短时间
    3. 最长时间
    4. 标准差

    但这似乎不是一个好方法。因为这些时间取决于机器的状态,就好像CPU正忙着其他进程一样,结果会受到影响。

    如果这是个好方法,请你还是建议我。或者我可以用一些更好的方法。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Charles Eli Cheese    15 年前

    这是对算法基本速度的一个很好的度量,但找到总体性能取决于您如何使用某些东西。指令的数目也没有用。

    例如,假设您有一些用C编写的func domath()和一些接受3-4个模板参数的模板domath调用。在一个简单的例子中,c函数通常会显示出更差的性能。然而,在一个大中型程序中,模板将增长到几十个或几百个,甚至数千个,而不仅仅是一个。这将阻塞指令缓存。同样的情况也适用于数据——一些树实现将具有更高的内存效率,而更臃肿的树实现将在简单的测试中表现更好,但在实际使用中,它们将表现得更差。

    类似地,树在基本测试中似乎有性能,但随着时间的推移,它会将内存碎片化得如此之多,以至于性能会随着时间的推移而不断下降,直到您的程序几乎无法运行为止。

    所以,性能总是取决于实际使用的东西,而不仅仅是它的实现。并不是说这总是一个折衷方案,有些实现比其他实现更好。不过,最终获得优异性能的唯一方法是深入了解计算机的工作原理和编译器的具体生成过程,否则对您来说永远是个谜。

    这就是为什么人们建议剖析,但剖析只会告诉你这么多,基本上是指点方向。你会看到症状,但往往不是原因。这是因为性能是基于整个系统的,而不是简单地计算指令数。