是否有一种既定的方法来度量(或获得现有的度量)JDK类方法的复杂性?javap
代表时间复杂度吗?代表到什么程度?特别是,我对Arrays.sort()
的复杂性以及其他一些集合操作方法感兴趣。
。我试图比较两种实现的性能,一个是使用Arrays.sort()
和一个没有。javap
反汇编不会返回更多的步骤(两倍多),但我不确定是否排除了Arrays.sort()
步骤。那么,一个方法的javap
是否包括在该方法中调用的方法的递归度量?
还有,有没有一种方法,不修改和重新编译Java代码本身,就能找到在特定参数上调用某个基本Java方法时完成了多少次循环迭代?例如,测量Arrays.sort('A', 'r', 'T', 'f')
的迭代次数
我不希望javap
能够代表实际速度。
Javadoc指定了算法的复杂度,但是如果你关心常数因素,那么除了实际的基准测试之外,绝对没有办法实际地比较常数因素。
你不能得到任何信息,当Arrays.sort
在一个基本数组上被调用,但是通过传递一个自定义的Comparator
来计算调用的次数,你可以计算在排序一个对象数组时进行的比较的次数。(也就是说,对象数组使用不同的排序算法进行排序——特别是稳定的排序算法——而原始数组使用快速排序变体进行排序。)
您可以使用javap
的输出来确定循环发生的位置,您希望找到goto
指令。这篇文章对这种识别进行了全面的解释。
From the post:
在考虑任何循环开始/退出工具之前,您应该看看什么是进入、退出和继任者的定义。虽然循环只有一个入口点,但它可以有多个入口点退出点和/或多个继任者,通常由中断引起语句(有时带有标签)、返回语句和/或异常(是否显式捕获)。你还没有透露细节关于你正在调查的仪器,这是当然值得考虑在哪里插入代码(如果有的话)你想做什么?通常,某些仪器可能必须是在每个退出语句之前或在每个后续语句之前执行(在这种情况下,您必须移动原始语句)。
Arrays.sort()
对于原语使用调优快速排序。对于Object
使用归并排序(但这取决于实现)。
:数组
例如,sort(Object[])使用的算法不必是合并排序,但它必须是稳定的