【问题标题】:Whats the most correct (best) way to compare code algorithms/snippets? [closed]比较代码算法/片段的最正确(最佳)方法是什么? [关闭]
【发布时间】:2012-10-28 17:51:02
【问题描述】:

我编写了一个 C++ 代码来计算太阳辐射的反射(基于光线追踪原理)。 我已经包含了一些加速技术。 在我的文章中,我必须证明这些算法的合理性。我打算纯粹从时间基础上做,但@weberc2 HERE 的评论让人相信这不是最好的解决方案。

我看过像Very sleepyAMD Code Analyst这样的代码分析软件,它们有助于识别瓶颈等。

由于主管的编程知识可能很差,基于时间的分析似乎是最合乎逻辑的......

例如 “使用Grid active 运行相同的场景将计算精度提高了 20%,而时间上只有 2 秒的惩罚......”

这是一个单线程程序。 使用时间真的有那么危险吗? 有什么建议。 谢谢大家

【问题讨论】:

  • 我不关注 - 你对什么感兴趣?您应该定义比较标准。是:(1)时间? (2) 内存使用情况? (3) 准确性/最优性 (4) 代码可读性? (5) 代码可维护性 (6) ... ?答案取决于您(或客户)对您更重要的是什么
  • @amit 基本上,标记的人不会关心实际代码本身。他们更关心“我是如何找到解决方案的”,即“它是否给出了正确的答案?” (3) 准确性以及“单击 后需要多长时间才能得到答案”。我必须捍卫算法背后的逻辑。如果我开始谈论内存使用和可读性,他们就会迷失方向。
  • 我认为正确性、效率、可维护性可能是您想要评估的质量以比较您的解决方案。

标签: c++ algorithm time


【解决方案1】:

我不同意。比较时间非常好 - 但有一个限制。

单次运行说明不了什么。这就是为什么我们有 statistical tools 和测试以显示 A is distinct then B

在多个测试用例和各种条件下运行一系列测试。将数据(运行时间)存储在两个不同的列表中,然后运行统计测试以显示一个优于另一个

统计测试的“答案”是P-Value。 P值表示“你错的概率是多少”。例如,如果您有一组测试,并且您运行统计测试并找到P_Value = 0.01。这意味着有 99% 的概率 - 两个样本是不同的,您可以得出结论,平均值较低的样本更好。

统计测试的实际标准(至少在我的领域)是Wilcoxon Paired Signed Test


附:统计测试将“证明”其测试条件的假设,例如 - 如果您在 AMD CPU 上运行它,它不会说明 Intel CPU 上会发生什么(也许指令集使“更糟”的情况明显好转在里面)。

但是,请注意,尽管如此,它在人工智能和信息检索等领域的文章中是非常容易接受和广泛使用的。

【讨论】:

  • 是的。我同意 - 整个光线追踪器取决于统计数据。我将不得不多次运行相同的 senario。所以你不同意“如果他今天下午运行几个时钟测试,然后明天早上测试不同的算法,他的比较可能不可靠,因为他可能在下午与比早上更多的进程共享资源......”
  • @user1002744 如果这是您所关心的,请不要测量挂钟时间,而是测量实际的用户代码执行时间。然后你只需要确保没有交换等发生,从我的角度来看,你应该没问题。也许阿米特想在他/她的回答中包含这一点。
  • @user1002744:仍有出错的余地,但假设两者在相同的条件下运行,并且你得到一个好的 P 值,认为测试错误是不合理的。对于可以随机生成的数据尤其如此——您可以在其中运行数千个测试并基本上得到P-Value < 10^-20。在这种情况下出错的可能性真的很小,几乎没有。在现代科学中,统计数据在许多情况下实际上验证了一个主张。在人工智能领域,它是确定算法是否是最先进的主要工具。
  • @JonasWielicki 您的意思是 [link] (stackoverflow.com/questions/5248915/execution-time-of-c-program) 中的执行时间,您所说的交换是什么意思?那是swap @amit - 好吧,很酷,这就是我需要的保证。感谢您的帮助!
  • @user1002744 从联机帮助页中,我无法安全地读到 clock() 是您想要的。 getrusage()(在链接问题的最佳答案中也提到过)可以解决问题:我的意思是(并且仅由)进程花费的 CPU 时间量,由 rusage 中的 ru_utime 字段给出结构。通过交换我的意思是你的系统用完了物理内存并且必须将 RAM 移动到磁盘(交换分区/交换文件,因此交换)。
【解决方案2】:

“新版本的运行时间是旧版本的 50%,p=0.99”对主管是否意味着什么,取决于主管对算法对业务的重要性的了解。在许多情况下,对一个函数的测量进行统计分析对于致力于改进它的程序员来说是一个非常有用的工具,但对管理却毫无意义。

据推测,这段代码正在被优化,因为对业务很重要的东西将通过使其更快得到改进。通常,这就是在向主管报告结果时应该讨论的内容:“由于这种变化,事务 X 的典型案例将在平均 6 秒而不是 10 秒内完成”,“使用这个版本,我们可以运行两次我们的工程模拟在一个工作日内完成,而不是一个工作日”。

如果您考虑主管关心的业务目标,那么在优化期间要完成的特定类型的时间测量(挂钟或总 CPU 或用户 CPU 或内存占用)通常是显而易见的。

【讨论】:

  • 这正是我想做的!但也反过来。 “由于这种变化,交易 X 的典型案例将提高 10% 的准确度,并且只会在平均 4 秒内完成,这是一个合理的权衡” 从链接中的 cmets 我对输出感到紧张cpu 时间不是执行时间的真实指示,也不是程序/算法速度的公平衡量标准。我也明白,两次单次运行之间的比较是行不通的,我必须使用统计工具进行比较。
  • 有两个不同的问题。一是你是否需要统计工具。有时统计数据是显而易见的。例如,运行 30 次时,它的运行速度总是至少是两倍。
    另一个问题是这个函数的挂钟或这个函数的 cpu 时间是否是一个合法的衡量标准。对于本身不是业务目标的任何度量,您应该从业务目标开始并计算出它所依赖的更简单的度量。通常,最后一步应该是重新衡量业务目标,例如平均交易时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多