是否存在测量(或获取现有度量)JDK类方法复杂性的既定方法? javap
代表时间复杂性和程度。特别是,我对Arrays.sort()
的复杂性以及其他一些集合操作方法感兴趣。
E.g。我试图比较性能的两个实现,一个使用Arrays.sort()
而一个不使用。 javap
反汇编不会返回更多的步骤(两倍),但我不确定是否排除了Arrays.sort()
步骤。 IOW,一个方法的javap
是否包含对该方法中调用的方法的递归测量?
此外,有没有一种方法,在不修改和重新编译Java代码本身的情况下,找到在特定参数上调用某个基本Java方法时完成了多少循环迭代?例如。衡量Arrays.sort('A', 'r', 'T', 'f')
?
答案 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 [])使用的算法不一定是这样 合并,但它必须是稳定的