读取外部流程错误流会严重影响性能

时间:2016-11-29 11:16:50

标签: java python performance process inputstream

我有一个Java程序(包括其他东西)使用Input Stream从外部Python应用程序读取。

以下是我用来阅读它的代码:

InputStreamReader isr = new InputStreamReader(p.getInputStream()),
            isrError = new InputStreamReader(p.getErrorStream());

BufferedReader br = new BufferedReader(isr), brError = new BufferedReader(isrError);
new Thread() {
    @Override
    public void run() {
        try {
            while (brError.readLine() != null);

        } catch (Exception e) {
        }
    }
}.start();
while ((line = br.readLine()) != null) { //line is a previously declared String
    //do whatever with line
}

我也创建了线程来读取错误流,因为Python应用程序在出现问题时会抛出错误(我无法编辑它,它是第三方软件),并且由于某种原因,最终InputStream会被阻止不要读ErrorStream。

有没有办法让while (brError.readLine() != null);对性能的影响更小?

现在我正在研究使用VisualVM的性能,虽然Java软件通常保持在0-5%的CPU使用率之间,这非常好,但是这个循环使用了大约60-65%的用量线程,它唯一的功能是防止主循环阻塞。我需要尽可能地提高性能(这涉及到工业领域,因此正确使用资源非常重要)。

谢谢大家。

2 个答案:

答案 0 :(得分:1)

为了便于处理(如果您在运行时不需要内容),请使用redirectError(File)中的ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("foo", "-bar");
pb.redirectError(new File("/tmp/errors.log"));
pb.start();

如果你从while (brError.readLine() != null);获得cpu,你应该看一下错误流返回的内容。由于readLine()是一个阻塞调用,这意味着错误流会输出很多行。

答案 1 :(得分:0)

你正在将丢弃的流转换为不必要的字符,这可能有点贵,特别是当你使用UTF-8时(取决于平台编码通常是错误的,无论如何)。

删除Reader,使用BufferedInputStream作为丢弃流。

但是,对于外部进程,重定向肯定是优越的,因为在Java中根本没有处理。