Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.out.print效率_Java_Performance_Io_Stringbuilder - Fatal编程技术网

Java System.out.print效率

Java System.out.print效率,java,performance,io,stringbuilder,Java,Performance,Io,Stringbuilder,在过去的几天里,我做了一些有竞争力的编程练习,发现了一些问题的解决方案,他们没有在控制台中以for循环打印文本,而是通过在文本之后追加文本来构建一个StringBuilder。首先我感到困惑,但我尝试了一下,并制定了一些基准 第一个测试:这是在屏幕上打印内容的经典方法: class TestClass { public static void main(String args[]) throws Exception { double startTime = System

在过去的几天里,我做了一些有竞争力的编程练习,发现了一些问题的解决方案,他们没有在控制台中以for循环打印文本,而是通过在文本之后追加文本来构建一个StringBuilder。首先我感到困惑,但我尝试了一下,并制定了一些基准

第一个测试:这是在屏幕上打印内容的经典方法:

class TestClass {

    public static void main(String args[]) throws Exception {
        double startTime = System.currentTimeMillis();

        //code
        for (int i = 0; i < 1000000; i++) {
            System.out.print("test");
        }
        //code
        double endTime = System.currentTimeMillis();
        String result = String.format("for loop: %.5f", (endTime-startTime) / 1000);
        System.out.print("\n"+result);
    }

}
在使用Intel i5 6500四核3.2 GHZ CPU Win 10运行测试数次后,结果如下:

first test(for loop): 4,25s  
second test(StringBuilder): 0.23s
结果并不意外,因为out.print是同步的,所以每次调用它时,都会增加一些开销。但速度慢了近20倍有点奇怪

我的问题是:我们有没有办法进一步改进这一点?

在这种情况下,同步关键字不应该受到指责

第一个测试用例很慢,因为System.out.print将带来频繁的最小I/O

您也可以使用BufferedWriterit的写入方法进行同步,以减少不必要的I/O:

BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));

//code
for (int i = 0; i < 1000000; i++) {
    log.write("test");
}

for loop: 0.21200

阅读本文:基准测试-好的,谢谢,我会尽快看一看。控制台输出非常慢,因为文本需要以图形方式呈现,这需要完全重画控制台屏幕。它不使用GPU,因为这会增加更多依赖项,因此您必须等待CPU重新绘制屏幕。这意味着您将等待CPU迭代每个像素,以便在每次输出后正确更新屏幕。每次调用输出函数可能需要几十万到几百万个CPU周期。用具体大小初始化StringBuilder的想法很好,我对它进行了测试,它确实提高了性能您确定StringBuilder的容量是以字节而不是字符来衡量的吗?@DodgyCodeException是的,检查源代码。哪个版本?在Java 8中,StringBuilder是使用char[]实现的。@DodgyCodeException Java 10.0.1
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));

//code
for (int i = 0; i < 1000000; i++) {
    log.write("test");
}

for loop: 0.21200
StringBuilder sb = new StringBuilder(1000000 * 10);