哪些代码优化有意义
从编译器的角度来看?
编译器无法推理的所有问题,因为编译器非常愚蠢,而 Java 没有“契约式设计”(因此,这无法帮助愚蠢的编译器推理您的代码)。
例如,如果您正在处理数据并使用 int[] 或 long[] 数组,您可能知道一些关于您的数据IMPOSSIBLE供编译器计算的信息,您可以使用低级位打包/压缩,以提高代码中该部分引用的局部性。
去过那里,做到了,看到了巨大的加速。 “超级智能编译器”就这么多。
这只是一个例子。这样的案例比比皆是。
请记住,编译器真的很愚蠢:它无法知道 if ( Math.abs(42) > 0 ) 将始终返回 true。
这应该给那些认为那些编译器是“智能”的人一些启发(如果 Java 有 DbC,情况会有所不同,但事实并非如此)。
有哪些最佳做法:
vmargs,堆和其他东西传递给
JVM 进行初始化。我如何能
在这里得到正确的值?在那儿
任何公式还是尝试和错误?
真正的答案是:不应该。可悲的是,由于 Java 方面的严重失败,这种情况是如此可悲,以至于需要这种低级的黑客攻击。哦,还有一个“小”细节:玩 VM 微调只适用于服务器端应用程序。它不适用于桌面应用。
任何曾在成百上千台机器上、在各种操作系统上安装过 Java 桌面应用程序的人都非常清楚问题是什么:完全 GC 暂停使您的应用程序看起来像是损坏了。想到 OS X 10.4 上的 Apple VM,因为它特别可靠,但 所有 JVM 都会遇到这个问题。
更糟糕的是:当您的应用程序要在成百上千的不同配置上运行时,不可能跨不同的操作系统/虚拟机/内存配置“微调”GC 的参数。
任何对此提出异议的人:请告诉我您如何“微调”您的应用程序,因为您知道它将在装有 20 GB 内存的八核 Mac 上运行(我有这样设置的用户)和旧的具有 768 MB 内存的 OS X 10.4 PowerBook。请问?
但这还不错:首先,您不应该关注像 GC“微调”这样的超低级细节。暗示这一点的事实证明了 Java 存在重大问题的一个领域。
Java 爱好者会一直说“GC 超级快,创建对象很便宜”,而这显然是错误的。 Trove 的 TIntIntHashMap 绕圈运行 HashMap 是有原因的。
还有一个原因是,在每个新的 JVM 版本中,您都会收到无数的发行说明,解释为什么 -XXGCHyperSteroidMultiTopNotch 提供比每个酷 Java 程序员都必须知道的最后一个“大 JVM 参数”更好的性能:也许 JVM 在 GC 方面并没有那么。
那么回答您的问题:您如何加快 Java 程序的速度?简单,就像 Trove 的人所做的那样:停止不必要地创建大量对象并停止不必要地自动(取消)装箱原语,因为它们会杀死您的应用程序的性能。
A TIntIntHashMap OWNS 默认的 HashMap 原因:出于同样的原因,我的应用现在比以前快很多。
我不再相信诸如“对象创建不需要任何成本”和“GC 是超级优化的,不用担心”这样的废话。
我正在使用 Java 来处理数据(我知道,我有点疯狂),让我的应用程序更快的一件事是不要再相信围绕“廉价对象创建”和“惊人的快速 GC”的所有宣传”。
事实是:不要尝试微调您的 GC 设置,而是首先停止创建那么多垃圾。这可以这样说:如果更改 GC 设置从根本上改变了您的应用程序的运行方式,那么可能是时候怀疑您创建的所有不必要的垃圾对象是否真的需要。
哦,你知道吗,我打赌我们会看到越来越多的发行说明解释为什么 Java 版本 x.y.z 的 GC 比版本 x.y.z-1 的 GC 快;)