JDK类方法的时间复杂度度量

时间:2013-03-28 19:36:28

标签: java performance time-complexity javap

是否存在测量(或获取现有度量)JDK类方法复杂性的既定方法? javap代表时间复杂性和程度。特别是,我对Arrays.sort()的复杂性以及其他一些集合操作方法感兴趣。

E.g。我试图比较性能的两个实现,一个使用Arrays.sort()而一个不使用。 javap反汇编不会返回更多的步骤(两倍),但我不确定是否排除了Arrays.sort()步骤。 IOW,一个方法的javap是否包含对该方法中调用的方法的递归测量?

此外,有没有一种方法,在不修改和重新编译Java代码本身的情况下,找到在特定参数上调用某个基本Java方法时完成了多少循环迭代?例如。衡量Arrays.sort('A', 'r', 'T', 'f')

的迭代次数

3 个答案:

答案 0 :(得分:3)

我不希望javap有点代表实际速度。

Javadoc指定了算法的复杂性,但如果你关心常数因素,除了实际的benchmarks之外,绝对没有办法真实地比较常数因子。

您无法获得有关在基本数组上调用Arrays.sort时所执行操作的任何信息,但通过传递计算调用次数的自定义Comparator,您可以计算数量排序对象数组时进行的比较。 (也就是说,对象数组使用不同的排序算法排序 - 特别是稳定的排序算法 - 原始数组使用Quicksort变体排序。)

答案 1 :(得分:1)

您可以使用javap的输出来确定您想要找到goto指令的循环。这个post给出了对该识别的全面解释。

来自帖子:

  

在考虑任何循环启动/退出检测之前,您应该这样做   查看入口,出口和后继者的定义。   虽然循环只有一个入口点,但它可能有多个入口点   退出点和/或多个后继者,通常由休息引起   陈述(有时带有标签),退货陈述和/或   异常(明确捕获或未捕获)。虽然你没有提供细节   关于你正在调查的那种仪器,它是   当然值得考虑你想要插入代码的地方(如果是的话)   你想做什么)。通常,某些仪器可能必须是   在每个退出语句之前完成,或者代替每个后继语句   (在这种情况下,你必须移动原始陈述。)

答案 2 :(得分:0)

原语的

Arrays.sort()使用tuned quicksort。对于Object使用mergesort(但这取决于实现)。

来自:Arrays

  

例如,sort(Object [])使用的算法不一定是这样   合并,但它必须是稳定的