我应该在循环内部还是外部“新建”一个对象?
Should I `new` an object inside or outside of a loop?
在以下代码中比较 test1()
和 test2()
:
class Test{
//max value is a large number
int max_value = 100*1000;
public void test1(){
for(int i=0; i<max_value;){
StringBuilder builder = new StringBuilder();
builder.append("String value");
builder.append("append our value much time so will consume many memory");
}
}
public void test2(){
StringBuilder builder = new StringBuilder();
for(int i=0; i<max_value;i++){
builder.append("String value");
builder.append("append our value much time so will consume many memory");
builder.setLength(0);
}
}
}
哪种方法更适合我们的程序?我认为是test2()
,但是在我的项目中,当我使用test2()
这样的代码时,我的程序执行时间是test1()
的两倍;为什么是这样?
通常test1()
会创建比test2()
更多的对象,所以test1()
会占用更多内存吗?对于垃圾回收,我该如何恢复 test1()
中的构建器对象?
微基准对测试前 JVM 的状态有很大影响。
如果要测试你的表现,你 运行 两个代码 一个接一个 这会对结果产生很大的影响。
所以叫法不一样
test1();
test2();
或
test2();
test1();
因为在 test1
中您使用了整个空闲内存,而碰巧 test2
需要 运行 垃圾收集器。
对于setLength
的内部实现,仅考虑性能问题,最好使用第二种实现(test2
)。
请记住,表演并非全部。更改 StringBuilder
的长度并不直观,因此从程序员的角度来看很容易误解第二种实现方式。 通常可读性更好的代码比性能更高的代码更好。
JVM lots of small objects 太棒了。这就是您在 test1
中拥有的内容。
在 test2
中,VM 可以做的任何优化都被丢弃,因为它必须在 StringBuilder
中将支持数组归零。
但这还没有结束。微基准很难得到正确的结果,并且结果不会在每个平台上都是正确的。因此,与其过分担心它们,不如编写可读代码 (IMO test1
)。这样当分析器告诉您 "this is what takes so much time" 您可以更轻松地优化它。
在以下代码中比较 test1()
和 test2()
:
class Test{
//max value is a large number
int max_value = 100*1000;
public void test1(){
for(int i=0; i<max_value;){
StringBuilder builder = new StringBuilder();
builder.append("String value");
builder.append("append our value much time so will consume many memory");
}
}
public void test2(){
StringBuilder builder = new StringBuilder();
for(int i=0; i<max_value;i++){
builder.append("String value");
builder.append("append our value much time so will consume many memory");
builder.setLength(0);
}
}
}
哪种方法更适合我们的程序?我认为是test2()
,但是在我的项目中,当我使用test2()
这样的代码时,我的程序执行时间是test1()
的两倍;为什么是这样?
通常test1()
会创建比test2()
更多的对象,所以test1()
会占用更多内存吗?对于垃圾回收,我该如何恢复 test1()
中的构建器对象?
微基准对测试前 JVM 的状态有很大影响。
如果要测试你的表现,你 运行 两个代码 一个接一个 这会对结果产生很大的影响。
所以叫法不一样
test1();
test2();
或
test2();
test1();
因为在 test1
中您使用了整个空闲内存,而碰巧 test2
需要 运行 垃圾收集器。
对于setLength
的内部实现,仅考虑性能问题,最好使用第二种实现(test2
)。
请记住,表演并非全部。更改 StringBuilder
的长度并不直观,因此从程序员的角度来看很容易误解第二种实现方式。 通常可读性更好的代码比性能更高的代码更好。
JVM lots of small objects 太棒了。这就是您在 test1
中拥有的内容。
在 test2
中,VM 可以做的任何优化都被丢弃,因为它必须在 StringBuilder
中将支持数组归零。
但这还没有结束。微基准很难得到正确的结果,并且结果不会在每个平台上都是正确的。因此,与其过分担心它们,不如编写可读代码 (IMO test1
)。这样当分析器告诉您 "this is what takes so much time" 您可以更轻松地优化它。