Java Static/Instance 方法优化
Java Static/Instance method optimization
在Java中是未修改的方法变量,缺少final
,
每次在 a
中重新初始化限定符
- 静态方法
- 实例方法
如果 1. 或 2.(或两者)的答案是 final
限定符
允许 Java 执行优化并存储方法
变量只有一次?
如果答案取决于变量的类型,那
变量是optimized/unoptimized?例如,是 String
,
int
优化而 Map
未优化?
相比之下,Java 只会存储静态 class 变量
比如
private static final String foo = "Teenage Mutant Ninja Turtle";
一次。澄清一下:问题是是否
1:
static SomeReturnValueOrVoid SomeMethod() {
// 1.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 1.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
2:
SomeReturnValueOrVoid SomeMethod() { // not static
// 2.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 2.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
相当于
3:
class SomeClass {
static final String foo = "Teenage Mutant Ninja Turtle";
SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
static SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
...
}
无论是 static
方法还是 final
变量或两者,都没有区别。局部变量的范围意味着每次都会发生这种赋值(除了优化*)。
但是,当涉及到您的示例中的字符串时,这些字符串将来自 string pool。所以分配每次都会发生,但它们都会引用相同的 string
实例。
*优化 - JIT compiler 可以内联值,因此每个解决方案可能 运行 与另一个解决方案一样快。因此,除非您意识到实际的性能问题,否则不应尝试对自己进行微优化。
In Java are unmodified method variables, that lack the final, qualifier re-initialized each time
(方法被调用)- 当然是,否则它们将未初始化。
我想你真正想问的是,这个初始化可以通过某种方式优化吗?如果变量被赋予一个常量值,那么是; JIT 编译器可能会完全删除变量,并用它的(已知常量)值替换对它的引用。
would the final qualifier allow Java to perform an optimization and store the method variable only once?
没有。 final
限定的局部变量不能更改其值,但方法的每次调用都有其自己的变量副本,并且不同的实例化可能对同一 final
变量使用不同的值。考虑:
void someMethod()
{
final int number = new Random().nextInt();
}
不能在程序执行过程中只赋值一次,因为每次调用方法时都不一样
局部变量的final
修饰符对优化几乎没有直接影响。它只对变量可以做什么进行限制 - 任何变量都可以遵循的限制,无论 final
资格如何 - 这反过来又允许进行某些优化。如果优化器物有所值,它不会关心变量是否声明为 final
,而是会考虑它是否 有效 常量。
在Java中是未修改的方法变量,缺少final
,
每次在 a
- 静态方法
- 实例方法
如果 1. 或 2.(或两者)的答案是 final
限定符
允许 Java 执行优化并存储方法
变量只有一次?
如果答案取决于变量的类型,那
变量是optimized/unoptimized?例如,是 String
,
int
优化而 Map
未优化?
相比之下,Java 只会存储静态 class 变量 比如
private static final String foo = "Teenage Mutant Ninja Turtle";
一次。澄清一下:问题是是否
1:
static SomeReturnValueOrVoid SomeMethod() {
// 1.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 1.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
2:
SomeReturnValueOrVoid SomeMethod() { // not static
// 2.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 2.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
相当于
3:
class SomeClass {
static final String foo = "Teenage Mutant Ninja Turtle";
SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
static SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
...
}
无论是 static
方法还是 final
变量或两者,都没有区别。局部变量的范围意味着每次都会发生这种赋值(除了优化*)。
但是,当涉及到您的示例中的字符串时,这些字符串将来自 string pool。所以分配每次都会发生,但它们都会引用相同的 string
实例。
*优化 - JIT compiler 可以内联值,因此每个解决方案可能 运行 与另一个解决方案一样快。因此,除非您意识到实际的性能问题,否则不应尝试对自己进行微优化。
In Java are unmodified method variables, that lack the final, qualifier re-initialized each time
(方法被调用)- 当然是,否则它们将未初始化。
我想你真正想问的是,这个初始化可以通过某种方式优化吗?如果变量被赋予一个常量值,那么是; JIT 编译器可能会完全删除变量,并用它的(已知常量)值替换对它的引用。
would the final qualifier allow Java to perform an optimization and store the method variable only once?
没有。 final
限定的局部变量不能更改其值,但方法的每次调用都有其自己的变量副本,并且不同的实例化可能对同一 final
变量使用不同的值。考虑:
void someMethod()
{
final int number = new Random().nextInt();
}
不能在程序执行过程中只赋值一次,因为每次调用方法时都不一样
局部变量的final
修饰符对优化几乎没有直接影响。它只对变量可以做什么进行限制 - 任何变量都可以遵循的限制,无论 final
资格如何 - 这反过来又允许进行某些优化。如果优化器物有所值,它不会关心变量是否声明为 final
,而是会考虑它是否 有效 常量。