出于这个问题的目的,我对big-O计算不感兴趣;据我所知,它用于比较算法之间的相对比较,而我想估算运行算法所需的绝对时间。
例如,我使用视觉算法,执行大约200万次计算/帧。该程序在core-i7桌面上运行。那么,需要多长时间?
要计算这个持续时间,我应该把cpu操作作为最坏情况计算(*,/,+,..浮点数或其他东西)?
答案 0 :(得分:1)
您可以使用floating point operations per second并计算算法所需的最差情况。您还可以使用特定(且足够大)的输入大小计算算法时间,并使用时间复杂度分析来估计最坏情况下的执行时间。
答案 1 :(得分:1)
您必须以某种方式获得执行时间的基线,因为执行时间可能会因架构而异。
例如,缓存未命中可能会占用300个CPU周期,而如果您有缓存命中,则相同的数据访问可能仅耗费5个周期。如果你将所有变量访问加起来,它可以长期改变运行时间。
因此,您必须了解算法在特定输入大小上的执行时间。然后将其与预期的复杂性(Big-O复杂度)进行匹配。然后,您推导出前导常量的近似值,现在您可以在合理的输入上近似算法的执行时间。
通过合理的,我的意思是你不会遇到完全不同的行为的输入,例如交换/分页(你基本上不能对运行时间有太多的了解)。
答案 2 :(得分:1)
如果没有更多信息,可能无法获得有意义的答案。
首先,很大程度上取决于可以并行执行多少个操作。首先让我们考虑理想情况:您已经优化了代码以完美并行执行。每个内核每个时钟周期执行4条指令。
在这种情况下,您每个时钟周期停用16条指令,因此您有200万/ 16 = 125000个时钟周期。在4 GHz时,这可以达到31.25微秒。
在相反的极端,我们假设代码完全是串行的 - 每个时钟周期最多只有一条指令退出。对于更糟糕的情况,它可能不仅是串行的,而且是严重的存储器限制,因此每(例如)100个时钟周期(平均)只有一条指令退出。在这种情况下,您需要50毫秒才能执行相同数量的指令 - 速度超过1000倍。
这些当然是非常极端的例子 - 更典型的情况可能是有几十条指令的高速缓存未命中,每个时钟周期平均给出1.8条指令。平均利用率可能为2.5个内核,每个时钟周期平均可获得4.5条指令。这将产生444444个时钟周期,其工作时间为111微秒(再次,假设为4 GHz)。