我有一段代码,我想测量它的时间效率.由于从代码本身估计这种复杂性很难,我想把它放在循环中并对结果计时.一旦收集到足够的数据点(大小 - >时间),我就能看出哪条曲线最合适.
利用给定大小的随机输入数据多次重复操作可以消除由于OS决定在不良时刻进行多任务而导致的波动,从而产生更精确的时间.增加问题的大小可以提供更多的点,理想情况下间距很大.
我的测试代码工作正常(初始,非定时预热循环减少加载时间;然后,从10的大小开始,以10%的增量扩展到1000000,重复运行直到5s有已完成或已完成5次完整运行).但是,我通过猜测得到了这些数字.
是否有一种可接受的"科学"方法来扩展重复和问题大小,以实现更快,更准确的时间尺寸图?是否有代码(或库)可以支撑所有无聊的位,并且我应该在滚动自己之前知道它?特别是,我可以认为,当发现时间上的颠簸时,可以采取更多措施 - 而相对平稳的读数可以简单地被认为是"足够好".
编辑
我知道计算大O复杂度的经典方法.它适用于具有良好代表性操作(例如,"比较"或"交换")的自包含算法.当不满足这些条件时,它不像宣传的那样工作(例如:LLVM的编译时C++模板实例化成本,这是一个庞大而复杂的,我不知道相关的代表操作是什么).这就是为什么我将它视为一个黑盒子,并试图从外部测量时间而不是代码检查.
测量时间复杂度可能非常困难(如果可能的话),我从未在算法论文中看到过这种情况.如果您无法根据(伪)代码或算法描述计算时间复杂度,那么您可以使用启发式来简化分析.
也许您还可以计算算法某些部分的复杂性,如果它们的复杂性明显小得多,则忽略其他部分.
如果没有任何帮助,通常的方法是显示算法如何在机器上缩放,就像你写的那样.但是有许多因素会影响结果.只是注意其中一些:
总而言之:我认为你只能得到一个想法,你的算法如何扩展,但你不能通过测量运行时来精确地获得复杂性的上限.也许这适用于非常小的例子,但对于较大的例子,你将得不到正确的结果.
你能做的最好的事情是:
通过这种方式,您可以查看更改是否改进了算法,其他人可以验证您的结果.
关于输入: