我有一段代码,我想测量它的时间效率.由于从代码本身估计这种复杂性很难,我想把它放在循环中并对结果计时.一旦收集到足够的数据点(大小 - >时间),我就能看出哪条曲线最合适.
利用给定大小的随机输入数据多次重复操作可以消除由于OS决定在不良时刻进行多任务而导致的波动,从而产生更精确的时间.增加问题的大小可以提供更多的点,理想情况下间距很大.
我的测试代码工作正常(初始,非定时预热循环减少加载时间;然后,从10的大小开始,以10%的增量扩展到1000000,重复运行直到5s有已完成或已完成5次完整运行).但是,我通过猜测得到了这些数字.
是否有一种可接受的"科学"方法来扩展重复和问题大小,以实现更快,更准确的时间尺寸图?是否有代码(或库)可以支撑所有无聊的位,并且我应该在滚动自己之前知道它?特别是,我可以认为,当发现时间上的颠簸时,可以采取更多措施 - 而相对平稳的读数可以简单地被认为是"足够好".
编辑
我知道计算大O复杂度的经典方法.它适用于具有良好代表性操作(例如,"比较"或"交换")的自包含算法.当不满足这些条件时,它不像宣传的那样工作(例如:LLVM的编译时C++模板实例化成本,这是一个庞大而复杂的,我不知道相关的代表操作是什么).这就是为什么我将它视为一个黑盒子,并试图从外部测量时间而不是代码检查.
对于给定的输入N,所包含的语句执行了多少次?
for i in 1 … N loop
for j in 1 … i loop
for k in 1 … j loop
sum = sum + i ;
end loop;
end loop;
end loop;
Run Code Online (Sandbox Code Playgroud)
任何人都可以找到一个简单的方法或公式来做到这一般.请解释.