我假设在略读this document之后,Java1.4和Java6之间存在巨大的性能差异。
我的问题是,当Java 6运行时必须运行的字节码在1.4中编译时,它还会有魔力吗?
“为什么要问这个问题”的一些背景知识。是here。
发布于 2012-04-26 18:57:49
是的,因为大多数优化都是由JVM在运行时完成的,所以编译器在优化方面所做的工作很少。因此,使用旧Java编译器编译的代码仍将受益于新的JVM。
但是,有一些优化是在编译时执行的,比如用StringBuilder替换连续的String连接。
发布于 2012-04-27 12:19:39
正如Tomasz Nurkiewicz指出的那样,大多数优化都是由JIT编译器完成的,如果运行在Java6而不是Java1.4上,您应该会看到性能上的好处。然而,这并不能保证你能提取出最好的结果。如果您使用的是较慢(较旧)的数据结构变体,您仍然会错过这些好处。例如,用StringBuffer代替StringBuilder,用矢量代替LinkedList,用哈希表代替HashMap,等等……
您还可以考虑使用javac的-deprecated标志进行编译。您可能希望替换已弃用的方法,因为它们通常意味着有一个性能更好的替代方法可以实现相同的功能。
发布于 2012-04-26 21:32:08
java中几乎所有的优化都发生在jit中,因此只依赖于运行应用程序的jvm版本。javac字节码编译器只会发出尽可能简单的字节码。我不认为在这个阶段有任何优化,可能除了使用StringBuilder / StringBuffer的字符串连接。
对于使用目标版本6编译的类,Java6和更高版本可以使用更快、更简单的bytecode verifier。javac编译器在每个堆栈槽中创建关于数据类型的附加信息,验证器必须验证这些信息。在以前的版本中,验证器必须推导出这些类型,这更加复杂。此更改只会加快类的加载速度,在实际执行字节码时应该不会有任何影响。
我认为在版本5或6中字节码的另一个变化是类文件中的常量池可以引用类和接口。同样,这可能只影响类加载。
https://stackoverflow.com/questions/10331921
复制相似问题