使用InputStream和Scanner获得令人费解的性能

时间:2015-05-11 19:46:43

标签: java linux eclipse logging inputstream

我似乎遇到了InputStream和扫描仪的奇怪性能问题。

我在日志文件中使用tail -F,基本上将其直播到我的代码。当我这样做时,我在60秒内获得约7,500,000行(每秒125,000行)。很公平。

现在,由于日志文件的写入速度实际上超过了125,000行/秒,因此我会使用日志文件来缩小搜索范围。

当我在我的linux shell中运行更新的tail -F命令时,我在60秒(667行/秒)内获得大约40,000行。当它没有被削弱时,在60秒内我的141,000行以下。

然而,当我通过我的代码运行完全相同的命令时,我会在60秒(266行/秒)内获得16,000行!所以在某个地方,我失去了一半的线条,我不知道为什么会这样做。

代码:

  public Boolean call() {
  //send command with no wait.
    final PrintStream out = new PrintStream(eCli.getOutputStream());

    //Notice the command terminator "\n" which is needed here for the command to be executed.
    out.print(tailCommandBuilder(logDir,fileName, filters));
    out.print((char)4);
    out.print('\n');
    final Scanner s = new Scanner(eCli.getInputStream());
    out.flush();
    //InputStream in =  new BufferedInputStream(eCli.getInputStream());
    StopWatch sw = new StopWatch();
    sw.reset();
    sw.start();
    log.info("Stopwatch started.");
    double lineCounter = 0;
    //final BufferedReader buffReader = new BufferedReader(new InputStreamReader(in));
    try {
        LOOP:
        while (keepRunning.get()) {

            if (s.hasNextLine()) {
                String st = s.nextLine();
                    lineCounter++;
            } else {
                keepRunning.getAndSet(false);
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        log.error("Error in IORead: " + e.getMessage() + e.getStackTrace());

    } finally {
        sw.stop();
        log.info("Total Time: " + sw.getTime());
            s.close();
        log.warn("Total Lines Read: " + lineCounter);
        eCli.clearBuffer();
        eCli.disconnect();
    } 
    return true;
}

编辑:

如前所述,eCli是一个扩展Cli'实现命令行接口类型实例的类。它使用InputStream / OutputStream进行通信。

我不使用--line-buffering with grep。

1 个答案:

答案 0 :(得分:0)

我想我正在缩小这里的答案。

我已经完全修改了前端代码,但实际上只有在grepped时从50%到66%的日志捕获百分比。唯一的区别是新实现从InputStream中获取的速度有多快。

日志似乎随着他们的输入“爆发”。我想某个地方有一个缓冲区需要增加来处理这个信息突发并允许日志平均。

需要在BufferedReader,InputStream或Shell中增加缓冲区。