BufferedWriter日志写入使用了大量的CPU

时间:2017-06-01 15:22:14

标签: java logging

我正在编写一个应用程序,它在文件中每20毫秒记录一次。因为日志记录经常发生,所以我检查了程序的CPU使用率并且它相当高。为了减少这种情况,我希望缓冲数据,一旦达到一定的大小,就将数据记录到文件中。反过来,这减少了我必须做的读写次数。这真的是一种最佳方法吗?

之前:

public void log(String log) {
    BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt", true));
    bw.write(log);
    bw.flush();
    bw.close();
}

后:

byte[] outputbArr = log.getBytes();

for (int i = 0; i < outputbArr.length; i++) {
    this.buf[this.bufSize] = outputbArr[i];
    this.bufSize++;
    if (this.bufSize == BUFLENGTH) {
        writeLog();
        this.buf = new byte[BUFLENGTH];
        this.bufSize = 0;
    }
}

private void writeLog() {
    FileOutputStream fos = new FileOutputStream("log.txt");
    fos.write(this.buf);
    fos.close();
}

有更好的方法吗?如何减少写入次数。对于这样的情况,通常采用什么方法?

1 个答案:

答案 0 :(得分:0)

打开后我不会关闭日志文件。打开一个追加文件至少和写一条消息本身一样昂贵。

此外,根据您所需的可靠性,不明确刷新日志编写器也会加快速度。缺点是,如果程序异常终止,如果最坏情况变得最糟,则仍然在写缓冲区中的部分日志可能会丢失。在许多情况下,shutdownhook可以减轻这种情况,但不是所有情况。

我更喜欢将FileOutputStream包装到BufferedOutputStream中,然后将其传递给OutputStreamWriter。控制BufferedOutputStream的缓冲区大小。通过这种方式,已编码的输出是缓冲的,通常(UTF8,ASCII,ISO)使缓冲区的效率提高两倍(每个字符1个字节,而不是每个缓冲的字符2个)。