如何判断Java代码的效率

如何判断Java代码的效率,java,optimization,performance,Java,Optimization,Performance,我刚刚意识到,我不知道如何从计算的角度判断一段Java代码是否有效。阅读多个源代码有时我觉得我正在阅读的代码效率很低,有时我感觉正好相反 你能列出需要遵守的基本单行规则以及它们为什么如此重要吗 编辑-我的问题与JVM的Java实现有关,所以类似Java分配问题、字符串管理、异常处理、线程同步等等 提前谢谢 p、 请不要按照字面上的“一行”来理解基本的一行规则?好的,给你: 避免不必要的计算 你是怎么做到的?对不起,没有人能回答这个问题( 嗯,人们花数年的时间在大学里学习计算机科学中的算法和数据结

我刚刚意识到,我不知道如何从计算的角度判断一段Java代码是否有效。阅读多个源代码有时我觉得我正在阅读的代码效率很低,有时我感觉正好相反

你能列出需要遵守的基本单行规则以及它们为什么如此重要吗

编辑-我的问题与JVM的Java实现有关,所以类似Java分配问题、字符串管理、异常处理、线程同步等等

提前谢谢


p、 请不要按照字面上的“一行”来理解基本的一行规则?好的,给你:

避免不必要的计算

你是怎么做到的?对不起,没有人能回答这个问题(

嗯,人们花数年的时间在大学里学习计算机科学中的算法和数据结构是有原因的……也许有一天会想上一门关于算法/数据结构的课程


我不确定你所说的“从计算的角度”是什么意思(这似乎意味着算法问题),但假设你指的是更类似于分析的技巧,请尝试以下方法:

  • 运行程序,然后突然暂停它,看看它暂停的地方。这样做几次;它停止最多的地方是瓶颈,停止的频率表明瓶颈有多严重

  • 避免装箱/取消装箱(在
    int
    Integer
    之间转换等);尤其要避免
    Integer[]
    列表
    ,以及其他内部存储基元类型对象数组的内容

  • 排除常见代码(有时是速度问题,有时是可读性问题)

  • 避免使用
    String
    操作循环;改用
    StringBuilder
    /
    StringBuffer
    。(简而言之,避免在不需要时创建和/或复制数据。)


如果想到其他事情,我会补充这一点。

使用。查看JProfile或任何其他探查器。

您可以使用
jconsole
监视应用程序的死锁、内存泄漏、线程和堆。简言之,您可以在图表中看到应用程序的性能


我支持Mherdad的回答,因为肯定没有“基本的单行规则”

关于建议使用评测工具的答案,只有了解算法时间复杂性和大O表示法,评测才真正有用。来自维基百科的大O表示法:

在数学、计算机科学和 相关字段,大O表示法 描述对象的限制行为 当参数趋向于 朝向某一特定的价值或价值 无穷大,通常以更简单的形式表示 函数。大O符号 根据 它们的增长率:不同 具有相同增长率的函数 可以使用相同的O表示 符号

Big-O符号背后的思想是,它让你感觉到输入大小如何影响给定算法的执行时间。例如,考虑以下两种方法:

void linearFoo(List<String> strings){
    for(String s:strings){
      doSomethingWithString(s);
    }
}

void quadraticFoo(List<String> strings){
    for(String s:strings){
        for(String s1:strings){
            doSomethingWithTwoStrings(s,s1);
        }
    }
}
void linearFoo(列出字符串){
用于(字符串s:字符串){
带字符串的dosomething;
}
}
void quadraticFoo(列出字符串){
用于(字符串s:字符串){
for(字符串s1:字符串){
有两个字符串的dosomething(s,s1);
}
}
}
linearFoo
被称为O(n),意味着它的时间随着输入大小n(即
strings.size()
)线性增加。
quadraicfoo
被称为O(n2),意味着执行
quadraicfoo
所需的时间是
strings.size()
平方的函数


一旦您了解了程序分析工具的算法时间复杂性,您的程序分析工具将开始发挥作用。例如,您将能够知道,如果在分析过程中发现一个固定输入大小的方法通常需要1ms,如果该方法为O(n),则输入大小加倍将导致执行时间为2ms(1ms=n,因此2n=2ms)。但是,如果它是O(n2),加倍输入大小意味着您的方法将需要大约4ms来执行(1ms=n2,因此(2n)2=4ms)如果你真的需要Java中应该遵循的规则列表,请看Joshua Bloch的书。

这本书不仅提供了性能指南,而且还提供了Java编程的正确方法。

@Mehrdad:我说的是专业软件开发,在这本书中,评测通常非常有用,可以找出两者的位置eneck。如果我们谈论的是算法的复杂性,那么,当然,分析与此无关,但是为什么我们需要在这个线程中使用
java
标记呢?谢谢你,Roman,这正是我现在所做的,而且非常有帮助。然而,有时进行分析非常耗时,我更关注的是重复出现的问题我不是在谈论ads,我的问题更多的是关于语言/JVM和操作系统。有很多关于Java分配问题、字符串管理、异常处理、线程同步等的讨论。(顺便说一句,我是在大学里学习ads多年的人之一)@杰克:对不起,你的问题肯定没有传达这些信息,所以我们看不出你是从哪里来的。不过还是有点模糊;不确定你会得到多少帮助,但祝你好运!@Mehrdad:你说得对,我太简洁了。我会编辑这个问题。我说的“从计算角度”是指“速度”的具体优化与其他优化(如内存消耗或代码)相反size@Jack:顺便说一句,评测的文献基础非常薄弱。以下是来自SIGPLAN.I(谦虚咳嗽)的从我的观点来看,这本书之所以纤细,是因为它的主题其实很简单。你链接的那本书,加上我在上面找到的东西,我想回答我的问题,我们