gpt4 book ai didi

java - java如何优化?示例代码

转载 作者:行者123 更新时间:2023-11-29 04:32:47 24 4
gpt4 key购买 nike

考虑这个小类:

public class Example {
public int plus(int a){
int b;
b = 1;
return b+a;
}
}

javap 说:

public int plus(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=2
0: iconst_1
1: istore_2
2: iload_2
3: iload_1
4: iadd
5: ireturn
LineNumberTable:
line 4: 0
line 5: 2

我不明白为什么我们需要第 1 行和第 2 行?

听说 Java Runtime 环境会统计函数调用次数,如果超过一定次数就会编译函数。

这是否意味着 Java 编译器将所有优化都留给了字节码编译器?例如。 Java 程序启动缓慢并随时间变快?

请解释!

最佳答案

首先,您正在查看字节码编译器的输出。典型的 Java 字节码编译器做的优化很少。重量级优化是由 JIT 编译器完成的……在运行时。

所以你看到的 javap -c 显示的是未优化的字节码。

I don't understand why we need line 1&2?

您正在查看未优化的字节码。前 2 条指令将 1 赋值给局部变量 b。我们可以看到局部变量很容易被优化掉。然而字节码编译器 (javac) 并不介意。

I heard that the Java Runtime environment counts function calls and compiles functions if they exceed a certain number of calls.

这就是典型的 Hotspot JVM 的工作方式。

Does that mean that the Java compiler leaves all optimisation to the byte code compiler?

没有。执行运行时编译和相关优化的是 JIT 编译器。

字节码编译器将 Java 源代码编译成字节码。 JIT 编译器将字节码编译为本地代码……在运行时。

E.g. Java programs start slow and become faster by time?

没错。初始字节码解释阶段和 JIT 编译是所谓的“JVM 预热”的一部分。


(根据要求...)

字节码编译器没有优化的原因包括:

  • 因为 JIT 编译器确实优化了(所以这会浪费精力),
  • 因为优化字节码可能在 JIT 编译器中更难优化(“聪明”代码比简单代码更难优化),并且
  • 因为未优化的字节代码使分析器或调试器更容易将代码关联回源代码行。

JIT 编译器进行优化的原因包括:

  • 因为需要在生成原生代码的步骤中完成才能达到最佳效果,
  • 因为它依赖于平台(例如,最佳代码取决于目标指令集,并可能取决于内存缓存大小、内核数量等),并且
  • 因为它允许您根据代码在执行时的观察到的行为进行优化(例如改进分支预测)。

最后,JIT 编译非常适合 Java 的后期绑定(bind)模型。

关于java - java如何优化?示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43119920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com