Java 标准输出缓冲区大小是多少?

Java 标准输出缓冲区大小是多少?,java,stdout,stderr,Java,Stdout,Stderr,我正在向标准输出写入大量数据,我注意到,根据输出控制台,程序执行时间是可变的。例如,NetBeans控制台上的程序比Windows cmd上的慢 因此,我认为写入stdout会填充一个缓冲区,当这个缓冲区已满时,写入就会被阻塞(控制台输出消耗的速度不够快) 我用Java程序重现这种行为 这里有一个输出数据的程序 public class Output { public static void main(String[] args) { long start = Syst

我正在向标准输出写入大量数据,我注意到,根据输出控制台,程序执行时间是可变的。例如,NetBeans控制台上的程序比Windows cmd上的慢

因此,我认为写入stdout会填充一个缓冲区,当这个缓冲区已满时,写入就会被阻塞(控制台输出消耗的速度不够快)

我用Java程序重现这种行为

这里有一个输出数据的程序

public class Output {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        for (int i = 0; i < 10_000; i++) {
            System.out.println("Awesone Output ");
        }

        System.out.println("Total time : " + (System.currentTimeMillis() - start));
    }

}
我启动第二个启动输出并使用其输出。 没有睡眠,输出程序非常快,但速度非常慢

那么这个缓冲区的大小是多少


这只是出于好奇,我并没有试图实现某个特定的

系统的默认缓冲区大小。
out和
System.err
是8192。您可以通过查看其方法的源代码来查看它,如
println(String)
。他们使用带有默认缓冲区大小的
BufferedWriter
System.out
System.err的默认缓冲区大小为8192。您可以通过查看其方法的源代码来查看它,如
println(String)
。他们使用默认缓冲区大小的
BufferedWriter

没有睡眠,程序速度非常快,速度非常慢。
这与缓冲区大小无关。对于每行输出(10000行),程序至少休眠10毫秒。因此,使用
Thread.sleep(10)
时,您的程序在至少100秒内不会执行任何操作。这就是为什么使用
Thread.sleep()
时速度很慢的原因

关于
System.out.println()的性能,请检查以下问题:

底层操作系统操作(在控制台窗口上显示字符)很慢,因为

1.字节必须发送到控制台应用程序(应该相当快)

2.每个字符必须使用(通常)真字型字体呈现(这相当慢,顺便说一句,关闭抗锯齿可以提高性能)

3.可能必须滚动显示区域,以便将新行附加到可见区域(最佳情况:位块传输操作,最坏情况:重新呈现整个文本区域)

您也可以在Javadoc for
Process
class中找到这一点

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能会导致子流程阻塞,甚至死锁


对于UNIX,您可以检查以下链接:

无睡眠程序速度非常快,速度非常慢。
这与缓冲区大小无关。对于每行输出(10000行),程序至少休眠10毫秒。因此,使用
Thread.sleep(10)
时,您的程序在至少100秒内不会执行任何操作。这就是为什么使用
Thread.sleep()
时速度很慢的原因

关于
System.out.println()的性能,请检查以下问题:

底层操作系统操作(在控制台窗口上显示字符)很慢,因为

1.字节必须发送到控制台应用程序(应该相当快)

2.每个字符必须使用(通常)真字型字体呈现(这相当慢,顺便说一句,关闭抗锯齿可以提高性能)

3.可能必须滚动显示区域,以便将新行附加到可见区域(最佳情况:位块传输操作,最坏情况:重新呈现整个文本区域)

您也可以在Javadoc for
Process
class中找到这一点

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能会导致子流程阻塞,甚至死锁


对于UNIX,您可以查看此链接:

尝试查看此帖子,我不知道它是否记录在任何地方取决于osTry查看此帖子,我不知道它是否记录在任何地方取决于osIn在我的示例中有2个程序显然我指的是第一个没有睡眠的程序的速度!!!第一个只会被第二个慢读stdout 2。第二个程序模拟控制台。ot不能用于渲染,因为在我的测试中,屏幕上几乎没有打印任何东西来检查打印到屏幕上所引入的慢度,您可以在第一个程序中将
System.out.println()
替换为打印到文件系统上的文件。我不会在任何地方打印“很棒的输出”我只是从第二个程序中使用它。如果我慢慢地使用它,第一个程序就会变慢,如果我快速地使用它,它就会变快。我想知道为什么???我不想优化任何东西,我想知道为什么消费速度会影响生产速度。这是两个进程独立的唯一常见的事情应该是由操作系统管理的缓冲区,我正在寻找有关它的信息。你真的了解这个现象吗???在我的例子中有两个程序,很明显,我说的是第一个程序的速度,因为没有睡眠!!!第一个只会被第二个慢读stdout 2。第二个程序模拟控制台。ot不能用于渲染,因为在我的测试中,屏幕上几乎没有打印任何东西来检查打印到屏幕上所引入的慢度,您可以在第一个程序中将
System.out.println()
替换为打印到文件系统上的文件。我不会在任何地方打印“很棒的输出”我只是从第二个程序中使用它。如果我慢慢地使用它,第一个程序就会变慢,如果我快速地使用它,它就会变快。我想知道为什么???我不想优化任何东西,我想知道为什么消费速度会影响生产速度。这是两个进程独立的唯一常见的事情应该是一个缓冲区管理的操作系统和我正在寻找
public class StdoutBlocking {

    public static void main(String[] args) throws IOException, InterruptedException {

        ProcessBuilder processBuilder = new ProcessBuilder("java", "stackoverflowDemo.StdoutBlocking.Output");
        processBuilder.directory(new File("C:/Users/me/Documents/NetBeansProjects/tmp/build/classes"));
        Process process = processBuilder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        String lastLine = null;

        while ((line = reader.readLine()) != null) {
            Thread.sleep(10);
            lastLine = line;
        }
        System.out.println("done : " + lastLine);

    }
}