[英]How can I calculate the execution time of some method theoretically?
假设我有“堆排序”方法,其复杂时间为O(nlogn)。 当我在1000000输入上测量此方法的执行时间时,我得到了0.375770669秒。 如何从理论上计算出该方法的执行时间?
理论上没有办法计算这个。 这取决于许多因素,例如:
即使您了解所有这些,计算本质上也是Java JIT编译器和硬件执行的取证模拟。 考虑起来太复杂了。
在“速度”的理论测量方面,你可以合理地期望实现的最好的是在源代码级别计算抽象操作。 即使向下钻取和计算执行的字节码也可能难以实用。
我想比较测量的和理论的。
基本上,你不能。
您可以做的是为不同数量的输入运行代码,例如1000,10000,100000,1000000,10000000等,并记录排序所花费的时间。 然后根据XY图中的元素数绘制这些记录时间,看看是否得到O(nlogn)
复杂度曲线。
另请参阅此文档以进行堆排序分析和演示: http : //www.inf.fh-flensburg.de/lang/algorithmen/sortieren/heap/heapen.htm
请记住,O(·)或Θ(·)符号描述了增长的渐近速率 ,在n接近无穷大的极限中 :它描述了当您将输入大小乘以10时算法的速度有多慢。 这对应于实际输入尺寸的实际执行时间(与“无穷大”相比总是无限小)的程度,取决于用于分析算法的理论模型与您拥有的实际机器的对应程度。
具体来说,“堆排序取Θ(n log n)时间”意味着存在常数c 1和c 2 ,使得对于足够大的n ,如果T(n)是大小为n的输入所花费的时间,那么
c 1 n log n <T(n)<c 2 n log n
对于渐近的渐近行为,n = 1000000的大小可能是或者可能不是“足够大的n”。
然而,假设它是,并且将该语句解释为意味着所花费的时间大致为(cn log n)某个常数c,等于
c1000000lg(1000000)= 0.375770669秒
得到c≈1.88×10 -8 。 这意味着大小为n = 2000000的输入应该花费大约0.79秒,并且n = 10000000应该花费大约4.38秒。 您可以将此“理论”结果与通过使用该大小的输入运行算法获得的实验结果进行比较。
拇指典型的电脑一个大体规则是,C是介于10-7慢的电脑和算法,以及10 -9相当体面的之间。 将两端的另外两个因子乘以两个是安全的。 (这个想法是典型的分析给出常数c,例如1-200,典型的计算机速度在一个数量级或两个数量级。当然,“典型”是主观的,如果你尝试使用Fibonacci,你会可能会很失望。)
从先验猜测c约为10 -8开始,运行时间约为0.2秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.