Adi*_*Adi 3 java string memory-management
哪一个更好?
public class A {
private static final String DOSOMETHING_METRICS = "doSomethingmetrics";
private static final String SAYSOMETHING_METRICS = "saySomethingmetrics";
public void doSomething() {
...
System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
}
public void saySomething() {
...
System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public class A {
public void doSomething() {
final String DOSOMETHING_METRICS = "doSomethingmetrics";
...
System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
}
public void saySomething() {
final String SAYSOMETHING_METRICS = "saySomethingmetrics";
...
System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
}
}
Run Code Online (Sandbox Code Playgroud)
我认为方法1在内存优化的情况下获胜,因为编译器只分配了一次内存,垃圾收集器不需要释放在每个函数调用中创建的字符串.但是,我认为良好的编码实践建议变量应该绑定到必须使用的范围,并且常量应该定义为它们在方法2获胜的程序中首次使用时的常量.
你对此有什么看法?哪个方面更重要?这里的函数将被多次调用(比如说至少100K次).
在这两种情况下,这些都是JLS 4.12.4中定义的常量变量.因此,不仅字符串"doSomethingmetrics"和"saySomethingmetrics"被实现了,而且"doSomethingmetrics的度量标准是某种东西"和"Saysomethingmetrics的度量标准"也是如此.(是的,你需要在"是"之前添加一个空格.)
第一个版本在逻辑上有一个稍小的堆栈,但我希望JIT无论如何都要优化它.
我会使用你认为最具可读性的形式.如果您想确切知道特定应用程序的性能,那么正如以往一样,正确的做法是测试两种方式.
看看结果javap -v
,看起来第二种方法实际上有一点点优势,即非连接的字符串甚至不需要出现在常量池中,因为没有办法到达它们.所以你应该看到你的类文件在这方面变得越来越小.但同样,我非常怀疑这会有什么不同.
归档时间: |
|
查看次数: |
204 次 |
最近记录: |