代码之家  ›  专栏  ›  技术社区  ›  akdom

加速Java

  •  14
  • akdom  · 技术社区  · 17 年前

    这确实是两个问题,但它们非常相似,为了简单起见,我想我把它们放在一起:

    • 首先 :给定一个已建立的Java项目,除了简单的代码优化外,还有哪些合适的方法可以加速它?

    • 其次 :用Java从头开始编写程序时,有哪些好方法可以大大提高性能?

    请远离一般的优化技术,除非它们是 特定于Java的 .

    我问过这件事 Python Perl 早期的。对于Java,我想知道有什么好的技巧可以提高性能,是否有特别好的Java分析器。

    15 回复  |  直到 9 年前
        1
  •  19
  •   anjanb    17 年前

    首先:通过代码优化,我假设您已经完成了正确的算法和算法的正确实现。在这种情况下,您将使用探查器并查看您的垃圾收集器(GC)收集垃圾的频率以及它用于收集垃圾的时间。然后,您开始处理GC选项——但是要注意,如果您不知道自己在做什么,您可能会遇到麻烦。
    我假设您使用的是Java5/6。在这种情况下,我将在 http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html 还有一封关于java性能的非常好的新信,叫做 http://www.javaperformancetuning.com/ 你可以订阅的。

    除此之外,看看您可以消除多少try/catch块。看看是否可以消除不必要的异常抛出。

    尽可能使用缓存,但不要过度使用。

    阅读有效的Java,第一版和/或第二版

    剖析者:我用你的工具。对于Java1.5和更高版本来说,它非常好。你可以申请个人驾照。其他分析器也很好。

    就像您有单元测试和集成测试一样,有一些作为持续集成(CI)构建的一部分运行的性能测试也没有坏处。通过这种方式,您可以知道何时回归,特别是如果您使用的是良好的CI构建服务器。

        2
  •  12
  •   matt b    17 年前

    确保您的日志级别不会意外地留在调试:)

        3
  •  11
  •   Michael Myers KitsuneYMG    17 年前

    “测量,不要猜测。”
    这是一个好主意 article 关于使用 NetBeans Profiler 以加速iText PDF库。我自己也使用过NetBeans探查器,我发现它在跟踪我遇到的一些性能问题时非常简单和有用。

    对于较旧的应用程序,简单地迁移到Java6可能会提高性能。看见 this whitepaper 有关Java6中性能改进的信息。

        4
  •  8
  •   Bill K    17 年前

    使用最新的虚拟机——他们一直在进步。

    配置文件和测试。永远不要优化你的代码,除非你绝对确定你需要。

    如果它是一个GUI应用程序,从Swing切换到AWT或者Eclipse的工具包,它应该非常快。这在较旧的虚拟机上更为重要(我已经在嵌入式方面工作了一段时间,实际上我们在1.0.x虚拟机中,swing甚至不可用)

    我知道这并不是Java特有的,但不是分配对象——这包括循环中的字符串连接(在循环之外,这是可以接受的。这是您可能能做的最大的事情)。

    也可以保留对象,而不是释放/重新分配它们。有一些“引用”类可以用来保存您不需要但可能希望重用的对象——GC不会删除它们,除非它需要空间。

    如果需要,使用-MX参数分配更多空间。

    Java的速度很难提高很多——HotSpot已经为您做了很多事情,您认为可能会提高代码速度的任何事情都可能会降低代码的速度。

        5
  •  5
  •   Guvante    17 年前

    使用StringBuilder代替大型字符串连接集可以极大地提高性能。

    然而,我不能不说,常规做法的性能得到了好处,分析。我现在还不知道Java评测(只在学术上使用这种语言),但是评测可以帮助您识别代码中的问题部分,而且修复特定部分要容易得多,因为您需要查找一些内容。

        6
  •  5
  •   kohlerm    17 年前

    不要盲目优化。 使用您的工具包或任何其他优秀的探查器找出应用程序中的“热点”。

    您不仅需要查看CPU时间,还需要查看分配了多少内存以及 为某一步释放。 您还需要确保没有内存泄漏或高内存消耗。 据我所知,分析内存消耗的最佳工具是Eclipse内存分析器( http://www.eclipse.org/mat ).

    其他方面是线程争用和IO问题。 要了解分析争用问题的简单方法,请访问我的旧博客 https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737

        7
  •  3
  •   Robin    17 年前

    另一个潜在的性能增益可以通过切换到更快的VM来实现。它们并非都相等,有些更适合不同类型的应用。它们还可以具有各自支持的特定类型的自定义,以及标准的自定义。

    Some comparisons

    另外,要小心使用微基准测试性能,因为大多数虚拟机的工作方式都没有意义。因此,由于不明显的原因,一些非常简单的性能测试可能会表现出不同的行为。

    简单地运行一个测试,然后更改一小段代码或VM选项并再次运行,可能会产生不同的结果,但与您所做的更改无关。

        8
  •  2
  •   Nerdfest    17 年前

    对于评测,请尝试使用JAMON进行时间监控,使用NetBeans分析器进行一般性能和内存监控。

        9
  •  2
  •   Mike Dunlavey    17 年前

    你也问了关于C#的问题,我也会给出同样的答案,而且一开始就针对特定语言是错误的。一旦你用一般的技术和方法压缩了你能得到的每一个周期,那么语言特定的东西可能会有所不同。

        10
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    与任何语言一样,使用适当的算法和数据结构。

    OOP的一个好处是,您可以在不更改接口的情况下更改对象的实现。这使您可以开始使用nave实现进行编码,并在需要时替换它们。

        11
  •  1
  •   Vinnie    17 年前

    我已经看到,有时候只给JVM更多堆内存将有助于缓慢的应用程序。这是由 -xmx -xms 启动时的JVM选项。

        12
  •  1
  •   Tom Hawtin - tackline    17 年前

    从项目一开始就应该做一件事,这将是一个巨大的帮助:编写可读的代码。

    不要试图编写长方法来避免方法调用。编译器将在必要时内联,但可能会为长方法生成糟糕的代码。如果代码很难阅读,通常性能问题会由它做一些你在混乱中看不到的事情引起。

        13
  •  1
  •   Joshua    17 年前

    Java1.6_07+自带了自己的分析器。它被称为Java VisualVM。如果路径上有%JAVA\u HOME%/bin,只需在命令提示符下键入jvisualvm。

        14
  •  0
  •   I GIVE CRAP ANSWERS    17 年前

    以下是Peter Sestoft的(较旧)文件,值得一读: Performance in java .有些建议可能不再正确,因为Java在更新版本的优化中变得更好了。但是当探查器发现一些你用其他方法无法做到的事情时(例如,在算法上进行更改),仍然有一组很好的宝石可以利用和尝试。

        15
  •  0
  •   izb    17 年前

    这似乎无关紧要,但有一个原因 list of speed tips 在Android开发者网站上。它在手机上运行时使用的是非标准的dalvik字节码,但这里列出的许多技巧普遍适用于Java。