Java缓冲区大小会成为瓶颈吗

Will Java Buffer size be a bottleneck?

本文关键字:缓冲区 Java      更新时间:2023-10-16

我创建了一个Java应用程序,其中GUI与外部C++可执行文件交互。

我使用ProcessBuilder从C++执行程序创建输入/输出/错误并将其附加到GUI。我正在使用大小为1024的缓冲区。如果C++以非常高的速度执行大量的printf语句,而Java GUI读取1024大小的字符,该怎么办。这会造成瓶颈吗?

public void run()
{
        try
        {
            char[] buffer = new char[1024];
            for (int n = reader.read(); n != -1; n = reader.read(buffer))
            {
                writeBytes2Text(buffer, 0, n);
            }
        }
        catch (Exception x) 
        {
            //some exception
        }
    }

无论缓冲区的大小如何,瓶颈都会一直存在。唯一真正的解决方法是尽可能多地优化Java端。例如,每隔一段时间更新GUI,尽可能多地缓冲以弥补时间差距。通常,频率较低、粒度较粗的更新将提高吞吐量。

1024字节的缓冲区大小可以,但4096可能稍好一些。

大多数延迟将来自上下文切换、睡眠和唤醒线程。除非Java端缓冲区的大小要小得多,否则不会带来吞吐量问题。

C++输出流可能使用默认的4096字节输出缓冲区。如果C++进程正在缓慢地打印输出,那么在累积4096个字节之前,您不会看到任何输出。