Unit testing 验证时间复杂性的单元测试

Unit testing 验证时间复杂性的单元测试,unit-testing,complexity-theory,Unit Testing,Complexity Theory,有人使用单元测试来验证代码的时间/空间复杂性吗 谢谢 雨果这是你提出的一个非常好的观点。确定要使用单元测试进行此操作 单元测试主要是测试代码结果的一种“方法”。您测试它是否做了它应该做的事情,并且当您希望它失败时它失败了 时间和空间是两个非常重要的变量,你可能“想要”快速和低空间成本,但程序实际上做的恰恰相反,然后你得到了一个bug,这就是单元测试的目的,找到bug并解决它们 对于耗时的单元测试,您可能知道如何解决此问题,但这是一种相当不错的测试方法: Unit_Test_To_See_If_X

有人使用单元测试来验证代码的时间/空间复杂性吗

谢谢


雨果这是你提出的一个非常好的观点。确定要使用单元测试进行此操作

单元测试主要是测试代码结果的一种“方法”。您测试它是否做了它应该做的事情,并且当您希望它失败时它失败了

时间和空间是两个非常重要的变量,你可能“想要”快速和低空间成本,但程序实际上做的恰恰相反,然后你得到了一个bug,这就是单元测试的目的,找到bug并解决它们

对于耗时的单元测试,您可能知道如何解决此问题,但这是一种相当不错的测试方法:

Unit_Test_To_See_If_X_Takes_More_Than_Y_Seconds(int max_milli_seconds)
{
    int current_millis = getMillis();

    do_operations_on_objects_and_functions();

    int millis_after_executions = getMillis();

    int elapes_millis = millis_after_execution - current_millis;

    if ( elapsed_millis > max_milli_seconds )
      Assert(ERROR);

}

另外,当你考虑它时,你会有太多的测试吗?不,你不能。测试所有结果都是好的,即使你测试了“愚蠢”的东西,如果你没有测试结果,一个bug就进化了,这是否意味着它不存在只是因为你没有看到它或者你没有测试它

可能的解决方案是使用Filip的函数进行1次迭代测试,然后是100次、1000次、10000次(以此类推),并将结果绘制在图表上以确定时间复杂度。或者使用数学推导每次运行之间的最大因子差。我不确定你会如何测试空间


我不认为输出是简单的通过或失败,除非有一个现有的算法来推导最高因子(N^2等)并与之进行比较。

我在调整算法时遇到了类似的问题。我做的是循环它,然后除以循环数和大O值。然后,我称之为“q”或“质量值”。有趣的是,这个值和我预期的差不多是常量,对于坏参数,它会稍微高一点。关键是,如果你看一下大O的定义,你会得到一个除了主要计算之外的“不太占优势”计算的度量。它们通常是恒定的或具有较低的复杂性。在我的例子中,这是一个有点线性,但仍然没有考虑


我的建议是,计算这些质量值。然后你可以看到是否有一个突然的上升,这表明你上一次更改的副作用打破了你的复杂性假设。

虽然时间方面已经很好地涵盖了菲利普和乔什的答案,但空间问题更为复杂,因为所讨论的代码可能会释放完成时使用的任何内存和资源。因此,我猜想单元测试本身对于确定空间复杂度并不是特别有用。您可能需要一个探测器,或者其他一些监视器,与正在测试的coude异步运行


我想说,在正在测试的代码中提供一些现场日志/跟踪是最简单的解决方案,可能会从发布版本中删除。

Close,但不是No的完全副本,这不是重复。这个问题指向单元测试的一个问题或一个特殊领域,另一个问题是“关于单元测试的想法”的主观观点:)@菲利普:是的,我说“接近但不完全重复”,没有投票结束这个问题。另一个线程中的一些答案可能有用。这是确定执行某项任务所需大致时间的好方法,但不会提供算法复杂性的信息哦,当然不会,但是,您可以设置一个场景,在该场景中,您使用大量不同的输入/输出运行代码,并从中了解时间/空间是如何增长的。问题更多的是“如果”,而不是“如何”。但我只想展示一个单元测试的示例:)