当前位置: 首页 > 知识库问答 >
问题:

我应该使用javac-O选项进行优化吗?

夏侯华彩
2023-03-14

javac有一个有趣的-O选项:

通过内联静态、最终和私有方法优化编译代码。请注意,您的类可能会变得更大。

这个选项似乎不流行(隐藏?),我今天刚刚在CodeGlass 2014页面上发现了它。

-O在官方文档中没有提到,也没有在人类爪哇中提到...奇怪。

在类似问题的公认答案中,我们可以看到:

Java 中的优化主要由 JIT 编译器在运行时完成。因此,尝试指示它在编译时以某种方式进行优化是没有意义的(无论如何,当它只创建字节码时)。JIT几乎肯定会在现场做出更好的决策,了解确切的环境并观察代码特定部分的实际执行模式。

我的问题是:

我是否应该总是使用< code>-O选项?换句话说,使用< code>-O时代码总是运行得更快,还是根本没有区别?

也许班级人数增加太多会导致整体表现下降?或者JVM无论如何都会进行内联,所以最好让它去做?

类似的情况发生在<code>gcc-O3<code>标志上。

共有3个答案

常炯
2023-03-14

我不认为它像你想的那样做了任何优化:

-O通过内联静态、最终和私有方法来优化编译的代码。请注意,您的类可能会变得更大。

请看一下这些问题:

  • 由 Java 编译器优化
  • Java 代码编译器优化

使现代化

你不会在任何Oracle留档中找到这个,因为它实际上什么都不做(no-op)。此外,您的链接是一个非常非常旧的留档:

在你的链接中进入两个目录——这是jdk 1.1.3的文档。已经13 - 14岁了!我们现在在Jdk 7上,急切等待Jdk 8。

桑坚
2023-03-14

几乎从一开始,我就一直在使用Java。我构建了许多系统,有些是高性能的,有些是超高性能的,我从来没有发现这个标志有用。我想它可能曾经有过用处,但我从来不需要在意。

燕翼
2023-03-14

根据源代码中第553行周围的注释,这是一个空操作。

当JIT编译器效率不高或者根本没有JIT编译器时,这可能是有用的。

 类似资料:
  • 问题内容: 有一个有趣的选择: 通过内联静态,最终和私有方法来优化编译代码。请注意,您的班级可能会变大。 该选项似乎并不流行(隐藏?),我今天才在CodeCup 2014页面 上发现了它。 在官方文档中也没有提及。 在接受类似问题的答案中,我们可以看到: Java中的优化主要由JIT编译器在运行时完成。因此,没有必要试图指示它在编译时优化某种方式(无论如何它仅创建字节码)。JIT几乎肯定会在现场做

  • 这是用构建的好例子吗?有理由不这样做吗?我从未真正见过一个程序,无论它花多少时间在I/O上,都是为了大小而编译的。

  • 关于编译器(GCC)所做的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最优的?

  • 我正在使用JMH,一个OpenJDK微基准测试工具。构建过程创建<代码>微基准。我用调用并传递jar名称和JMH参数的jar。 我想知道我们应该使用选项运行基准测试吗?为什么? 换句话说,我是否应该使用以下命令运行基准测试:

  • 有几种使用SIMD指令优化HOG描述符计算的尝试:OpenCV、Dlib和SIMD。它们都使用标量代码将结果幅值添加到HOG直方图中: 在那里,大小的值取决于实现,但一般意义相同。 我知道使用SIMD计算直方图的问题并没有简单有效的解决方案。但在这种情况下,我们有小尺寸(18)的直方图。它能帮助SIMD优化吗?

  • 问题内容: 我最近一直在用C编写很多代码,现在正在切换到Java。我当前正在实现一个大型数据结构,并且想知道在调用Java编译器时是否可以打开任何优化标志,以提高gcc之类的性能。 我习惯于: 有类似的命令javac吗? 我正在使用JDK并正在运行Ubuntu 10.04。 问题答案: Java中的优化主要由JIT编译器在运行时完成。因此,没有必要试图指示它在编译时优化某种方式(无论如何它仅创建字