Performance 如何比较两种数据结构的运行时间';操作

Performance 如何比较两种数据结构的运行时间';操作,performance,algorithm,data-structures,dataset,Performance,Algorithm,Data Structures,Dataset,我想比较两个整数搜索树(AVL树和红黑树)的性能。那么,我应该如何设计/设计测试来实现这一点呢?例如,让我们考虑插入操作,我应该遵循哪些步骤,以便在RB情况下平均地说这个操作更快?我应该只插入一个元素(假设树是预先填充的)还是为一系列插入计时?我还应该考虑哪些因素才能正确地测量CPU时间 提前感谢。这是一个非常宽泛的问题,因此,我认为你不应该希望有人站在这里,给你一个关于如何衡量绩效的最终正确答案。话虽如此 首先,您应该开发一套测试。有两种流行的技术可以实现这一点:监视应用程序执行的实际操作序列

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


提前感谢。

这是一个非常宽泛的问题,因此,我认为你不应该希望有人站在这里,给你一个关于如何衡量绩效的最终正确答案。话虽如此

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

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

每个跟踪都应该执行很多次。您可以对此进行某种形式化(以将统计不确定性降低到已知范围内),但经验法则是,您的错误顺序将根据1/sqrt(n)缩小,其中n是试验次数。换言之,通过将每个跟踪运行10000次而不是100次,您将得到平均误差小10倍的结果。记录所有数值;要寻找的是平均值、中位数、模式等。对于每次运行,尽量保持系统条件不变;没有其他程序运行等。为了帮助消除由于外部因素变化而产生的虚假结果,您可以剔除底部和顶部10%的异常值

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

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

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


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

这是一个非常广泛的问题,因此,我认为你不应该指望任何人在这里取得进展,并就如何衡量绩效给出最后一个正确答案。话虽如此

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

一旦有了要测试的跟踪集,就需要开发一个驱动程序来进行评估。驱动程序应该很简单,对于AVL和RB树都是一样的(我认为在这种情况下,这不应该是一个问题;它们都向用户提供相同的界面,只是在内部实现细节方面有所不同)。Th