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

Java JDK类方法的时间复杂度度量,java,performance,time-complexity,javap,Java,Performance,Time Complexity,Javap,是否有一种既定的方法来度量(或获取现有的度量)JDK类方法的复杂性?是javap代表时间复杂度和程度。我特别感兴趣的是Arrays.sort()的复杂性,还有其他一些集合操作方法 例如,我试图比较两种实现的性能,一种使用Arrays.sort(),另一种不使用。对于它的javap反汇编不会返回更多的步骤(两倍多),但我不确定是否排除了Arrays.sort()步骤。那么,一个方法的javap是否包含在该方法中调用的方法的递归度量,还是仅为该方法调用的方法 另外,有没有一种方法,在不修改和重新编译

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

例如,我试图比较两种实现的性能,一种使用
Arrays.sort()
,另一种不使用。对于它的
javap
反汇编不会返回更多的步骤(两倍多),但我不确定是否排除了
Arrays.sort()
步骤。那么,一个方法的
javap
是否包含在该方法中调用的方法的递归度量,还是仅为该方法调用的方法


另外,有没有一种方法,在不修改和重新编译Java代码本身的情况下,可以找到在特定参数上调用某个基本Java方法时执行了多少次循环迭代?例如,测量
数组的迭代次数。排序('A','r','T','f')

您可以使用
javap
的输出来确定要查找
goto
指令的循环发生位置。这是对该身份的全面解释

从职位:

在考虑任何循环启动/退出检测之前,您应该 研究什么是进入、退出和继任者的定义。 虽然一个循环只有一个入口点,但它可能有多个入口点 退出点和/或多个后续点,通常由中断引起 语句(有时带有标签)、返回语句和/或 异常(是否显式捕获)。而你还没有给出细节 关于你正在调查的仪器,它是 当然值得考虑在何处插入代码(如果需要的话) 你想做什么)。通常情况下,可能需要安装一些仪器 在每个exit语句之前完成,或替代每个后续语句 (在这种情况下,您必须移动原始语句)


您可以使用
javap
的输出来确定要查找
goto
指令的循环发生位置。这是对该身份的全面解释

从职位:

在考虑任何循环启动/退出检测之前,您应该 研究什么是进入、退出和继任者的定义。 虽然一个循环只有一个入口点,但它可能有多个入口点 退出点和/或多个后续点,通常由中断引起 语句(有时带有标签)、返回语句和/或 异常(是否显式捕获)。而你还没有给出细节 关于你正在调查的仪器,它是 当然值得考虑在何处插入代码(如果需要的话) 你想做什么)。通常情况下,可能需要安装一些仪器 在每个exit语句之前完成,或替代每个后续语句 (在这种情况下,您必须移动原始语句)


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

Javadoc指定了算法的复杂性,但是如果您关心常量因子,那么除了与实际值比较之外,绝对没有办法实际地比较常量因子


您无法获取有关在对原始数组调用
数组时执行的操作的任何信息。对原始数组调用sort
,但通过传递一个计算调用次数的自定义
比较器,您可以计算对对象数组进行排序时进行的比较次数。(也就是说,对象数组是用不同的排序算法排序的,特别是一种稳定的算法,而基本数组是用快速排序变量排序的。)

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

Javadoc指定了算法的复杂性,但是如果您关心常量因子,那么除了与实际值比较之外,绝对没有办法实际地比较常量因子

您无法获取有关在对原始数组调用
数组时执行的操作的任何信息。对原始数组调用sort
,但通过传递一个计算调用次数的自定义
比较器,您可以计算对对象数组进行排序时进行的比较次数。(也就是说,对象数组使用不同的排序算法(特别是稳定的算法)进行排序,而基元数组使用快速排序变量进行排序。)

数组。基元的排序()使用优化的快速排序。对于
对象
使用合并排序(但这取决于实现)

发件人:

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

用于基本体的
Arrays.sort()
使用优化的快速排序。对于
对象
使用合并排序(但这取决于实现)

发件人:

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


但是一个方法的
javap
是否包含在该方法中调用的方法的递归度量,还是仅为该方法调用的方法。我不知道,但从研究的角度来看,我确实很感兴趣。@两栖动物:仅针对该方法。但一个方法的
javap
是否包含该方法中调用的方法的递归度量?两栖动物问得好。我不知道,但从研究的角度来看,我确实很感兴趣。@两栖动物:就是为了这个方法。他们没有在那页上列出任何
Caliper
的下载。目前卡钳有点不稳定;他们正在进行完全重写,但关键是你需要实际运行排序并对它们计时。所以基本上用实际数据进行采样?这是正确的。Java在JIT中进行了如此多的优化,以至于任何仅仅通过查看代码的猜测都几乎肯定是错误的