我应该在循环内部还是外部“新建”一个对象?

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" 您可以更轻松地优化它。