如何比较两种数据结构运行的运行时间

时间:2011-10-26 16:15:04

标签: performance algorithm data-structures dataset

我想比较两个整数搜索树(AVL树与RedBlack树)的性能。那么我应该如何设计/设计测试来实现这一目标呢?例如,让我们考虑 insert 操作,我应该遵循哪些步骤来说明在RB情况下这个操作平均更快?我应该只插入一个元素(假设树是预先填充的)或者我应该插入一系列插入吗?还应该考虑哪些因素来准确地正确测量CPU时间?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题,因此,我认为你不应该希望任何人能够在这里找到关于如何衡量绩效的最终正确答案。那就是说......

首先,您应该开发一套测试。这样做有两种流行的技术:监视由应用程序完成的实际操作序列(因此,找到一些使用AVL或RB树的开源应用程序,并添加一些代码以打印出它执行的操作序列)或以分析(或综合)方式创建这样的操作流以针对任何数量的情况(平均使用,特定种类的异常或其他异常使用,随机使用等)。你要测试的这些痕迹越多越好。

一旦测试完了一组跟踪,就需要开发一个驱动程序来进行评估。驱动程序应该很简单,对于AVL和RB树都是一样的(我认为在这种情况下,这应该不是问题;两者都向用户提供相同的接口,仅在内部实现细节方面有所不同)。驱动程序应该能够有效地重现跟踪集中记录的使用情况,并使跟踪的操作在您的数据结构上执行。我喜欢做的一件事是包括第三个“虚拟”候选人,什么都不做;通过这种方式,我可以看到跟踪处理对整体性能的影响有多大。

每条痕迹应该执行很多次。您可以稍微形式化(将统计不确定性降低到已知范围内),但经验法则是您的错误顺序将根据1 / sqrt(n)收缩,其中n是试验次数。换句话说,通过运行每个跟踪10,000次而不是100次,您将得到平均误差小10倍的错误。记录所有值;要寻找的是平均值,中位数,模式等。对于每次运行,尝试保持系统条件相同;没有其他程序运行等。为了帮助消除由于外部因素变化引起的虚假结果,你可以剔除底部和前10%的异常值......

现在,只需比较数据集即可。也许您最关心的是跟踪的平均时间?也许是最糟糕的?也许你真正关心的是一致性;标准差是大还是小?您应该有足够的数据来比较在两个测试结构上执行的给定跟踪的结果;对于不同的痕迹,查看不同的数字可能更有意义(例如,如果你创建了一个合成基准测试,这应该是RB树的最坏情况,你可能会问RB和AVL树有多糟糕,而你可能不会关心这个代表AVL树等最佳案例的另一条痕迹。)

CPU的时机本身就是一个挑战。您需要确保计时器的分辨率足以测量您的事件。 clock()和gettimeofday()函数 - 以及其他函数 - 是记录事件时间的流行选择。如果您的跟踪完成得太快,您可以获得多次试验的总时间(这样,如果您的计时器支持微秒计时并且您的跟踪在10微秒内完成,您可以测量100次执行而不是1,并获取时间值10毫秒,这应该是准确的。)

另一个潜在的缺陷是每次都提供相同的执行环境。在跟踪运行之间,您至少可以考虑确保以干净缓存开始的技术。要么是,要么没有计时第一次执行,要么明白当你消除异常值时可能会剔除这个结果。重置缓存可能更安全(通过操纵某些大型数组的每个元素,例如在执行跟踪之间),因为代码A可能会受益于缓存中的某些值,而代码B可能会受到影响。

这些是您在进行自己的绩效评估时可能会考虑的一些事项。其他工具 - 例如PAPI和其他分析器 - 可以测量某些事件 - 缓存命中/未命中,指令等 - 并且这些信息可以比简单的挂钟运行时间比较进行更丰富的比较。

答案 1 :(得分:0)

根据您的特定编程语言,实现等,准确地测量CPU时间可能非常棘手。例如,使用Java的JIT编译,结果可能会有很大差异,具体取决于您之前运行代码的程度! / p>

你能详细介绍一下你的情况吗?

相关问题