测试基于挂钟时间的算法

时间:2013-04-20 08:24:42

标签: c++ unit-testing

我目前正在维护一种算法,该算法使用挂钟时间来做出各种决定(例如,哪些解决方案可以快速计算,这些解决方案花费的时间太长而且需要报废)。

当尝试测试算法时,由于任何数量的变量(如机器负载,操作系统调度,IO等),每次结果可能会略有不同。

测试此类系统的标准方法是什么?执行CPU指令之类的东西是我的一个想法,但是我不确定在现代多核x86处理器上有多实用。

回退计划是将增量添加到内部计数器并更改算法的限制以尝试匹配现有挂钟版本的性能。然而,它将涉及大量的试验和错误,因此我想知道在我开始走这条道路之前是否有更简单的方法。

2 个答案:

答案 0 :(得分:2)

简单但粗略的选择是“抽象”墙上时间检索逻辑。

比如说,使用带有WallTime方法的类GetTime,并在整个应用程序中使用它。

这个班级可以使用两个“提供者”。一个是系统中的RT时钟。

另一个只是从预先录制的列表中返回值。

您记录第一次通过算法并存储GetTime返回的值。 这些值将形成第二个“时间提供者”的“预先记录”的值列表。

假设第二次运行将以完全相同的顺序调用GetTime,您只需返回与第一次运行时相同的时间值:)

如果要调整某些时间,也可以编辑列表。 您还可以拥有多个存储列表,以模拟不同的硬件。

示例:

假设算法的工作原理如下:

  1. GetTime - >从时钟返回T1
  2. 调用函数X
  3. GetTime - >从时钟返回T2
  4. 根据(T2 - T1)决定接下来要拨打的功能(例如Y
  5. GetTime - >从时钟返回T3
  6. 调用函数Y
  7. GetTime - >从时钟返回T4 ...
  8. 在列表中保存T1,T2,T3和T4之后,您可以完全重播上述运行(关于GetTime返回的值)。

    如果在步骤6中执行的功能(算法基于性能选择的功能)在第二次运行中不相同,即使(T2-T1)时间差相同,此解决方案也会失败,即它取决于一个可变的,非时间相关的参数。

答案 1 :(得分:0)

我喜欢@Andrei的解决方案,但是从您所描述的内容来看,您的算法似乎并不总是以相同的顺序进行定时调用。在这种情况下,我可能会创建一个简单的WallClockTimer类,它可以按名称/枚举记录各种持续时间(使用startTimerFor(SOME_KEY)getElapsedTimeFor(SOME_KEY)等方法)。您的算法将与此计时器协作以进行运行时决策。要测试这些决策,您可以让MockWallClockTimer返回给定键的预先指定的持续时间。