我正在尝试对大约1000个代码的数据集的时间复杂度进行实证分析。我手动注释了它们(算法如何根据输入的大小进行缩放),现在我试图根据我的复杂度等式Y=C+log X + X + X log X + X^2 + X^3 + X^4 + e^X
对时序数据进行回归。
作为程序执行时间的度量标准,我目前正在使用程序执行期间执行的字节代码数。可以通过Hotspot JVM中的-XX countBytecodes
标志找到此计数。我还尝试在热点JVM中使用和不使用-Xint
标志运行,这会强制JVM在解释模式下执行所有字节码。
然而,我面临的问题是,当我运行两次相同的程序时,执行计数会发生变化。由于这种变化是时间数据,回归结果会发生变化。 Furthar,当我运行相同代码的两个不同实例时,判决中的变化是巨大的。出于同样的原因,我没有使用System.currentTimeMillis/Nanos
的时间数据。 (我在160个代码的批量中依次运行数据6次,大约500次代码和3次并行。变化很大。甚至这些值之间的相关性也是随机的,范围从1.00到.37,在某些情况下甚至是小的负数。 )
所以我正在寻找备用的apporaches,它可以用作程序运行时间的度量标准。唯一的限制是该度量标准应该与代码的性能有直接关系,并且在代码执行多次时应该给出相同的计数。 (或至少相关性应接近1)。
我不想多次运行计时数据并采用均值/中位数,因为这会在很大程度上减慢速度。
在执行代码期间是否还有其他分析器可以给我计算执行的字节代码数?
如果两个代码相同,我只希望执行计数相同,否则。我的样本有一些简单的代码来解决小编程难题,其中无法进行大量的手工优化。它有可能比其他实现获得一些改进,但大多数大O保持不变(即使它变化很酷,只要执行计数显示)。我不想要的是,在第一次运行中,我得到一些执行计数,它被归类为线性,并再次运行(相同的相同代码),获得不同的执行计数,这被分类为不同的大O. / p>