0

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

例如,我试图比较两种实现的性能,一种正在使用Arrays.sort(),一种没有。javap反汇编不会返回更多步骤(两倍),但我不确定是否排除了这些步骤Arrays.sort()。IOW,javap一种方法是否包括在该方法内或仅为该方法调用的方法的递归测量?

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

4

3 回答 3

3

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

Javadoc 指定了算法的复杂性,但如果您关心常量因子,则绝对没有办法实际比较常量因子,除非与实际基准测试

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

于 2013-03-28T19:41:16.097 回答
1

您可以使用输出javap来确定要查找goto指令的循环发生的位置。这篇文章对该标识进行了全面的解释。

从帖子:

在考虑任何循环开始/退出检测之前,您应该查看入口、出口和后继者的定义。虽然一个循环只有一个入口点,但它可能有多个出口点和/或多个后继点,通常由 break 语句(有时带有标签)、return 语句和/或异常(是否显式捕获)引起。虽然您没有提供有关您正在调查的仪器类型的详细信息,但肯定值得考虑您想要在哪里插入代码(如果这是您想要做的)。通常,可能必须在每个退出语句之前或代替每个后继语句之前完成一些检测(在这种情况下,您必须移动原始语句)。

于 2013-03-28T19:39:15.633 回答
0

Arrays.sort()对于原语使用调整的快速排序。用于Object使用合并排序(但这取决于实现)。

来自:数组

例如,sort(Object[]) 使用的算法不必是归并排序,但它必须是稳定的

于 2013-03-28T19:43:49.597 回答