繁体   English   中英

如何从理论上计算出某些方法的执行时间?

[英]How can I calculate the execution time of some method theoretically?

假设我有“堆排序”方法,其复杂时间为O(nlogn)。 当我在1000000输入上测量此方法的执行时间时,我得到了0.375770669秒。 如何从理论上计算出该方法的执行时间?

理论上没有办法计算这个。 这取决于许多因素,例如:

  • java版和major / minor / patch版本号。
  • 各种JVM调优参数; 例如,堆有多大。
  • 您的硬件平台; CPU,内存大小,甚至主板和时钟速度。
  • 机器上的负载; 即它还在做什么。
  • CPU散热片上的绒毛量。 严重的是......如果处理器芯片太热,时钟速度可能会降低,主板振荡器时钟速度也会(有点)温度敏感。

即使您了解所有这些,计算本质上也是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM