Java JDK类方法的时间复杂度度量
是否有一种既定的方法来度量(或获取现有的度量)JDK类方法的复杂性?是Java JDK类方法的时间复杂度度量,java,performance,time-complexity,javap,Java,Performance,Time Complexity,Javap,是否有一种既定的方法来度量(或获取现有的度量)JDK类方法的复杂性?是javap代表时间复杂度和程度。我特别感兴趣的是Arrays.sort()的复杂性,还有其他一些集合操作方法 例如,我试图比较两种实现的性能,一种使用Arrays.sort(),另一种不使用。对于它的javap反汇编不会返回更多的步骤(两倍多),但我不确定是否排除了Arrays.sort()步骤。那么,一个方法的javap是否包含在该方法中调用的方法的递归度量,还是仅为该方法调用的方法 另外,有没有一种方法,在不修改和重新编译
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中进行了如此多的优化,以至于任何仅仅通过查看代码的猜测都几乎肯定是错误的