繁体   English   中英

Java 文件 stream 的 byte[] 与 char[] 的性能

[英]Java performance of byte[] vs. char[] for file stream

我正在编写一个读取文件的程序(使用自定义缓冲区,8KB),然后在该缓冲区中找到一个关键字。 由于 Java 提供了两种类型的流:字符和字节,我已经使用byte[]char[]来实现这个缓冲。

我只是想知道,这对性能来说会更快更好,因为char是 2 byte ,当使用Reader读取char[]时, Reader将执行从byte转换回char ,我认为这可能会比使用更慢只有byte[]

使用字节数组会更快:

  • 您没有字节到字符解码步骤,这至少是一个复制循环,并且可能更多取决于用于进行解码的字符集。

  • 字节数组将占用更少的空间,从而节省 GC / 初始化中的 CPU 周期。

然而:

  • 除非您正在搜索大文件,否则差异不大。

  • 如果输入文件未以 8 位字符集编码,则字节数组方法可能会失败。 即使它有效(就像 UTF-8 和 UTF-16 一样),跨越缓冲区边界的匹配字符也存在潜在问题。

(按字节处理对 UTF-8 和 UTF-16 起作用的原因是编码可以很容易地区分第一个单元(字节或短)和编码字符的后续单元。)

如果它是您正在阅读的二进制文件,请使用字节数组。

如果它是一个文本文件,并且您稍后将使用字符串等内容,那么您应该使用 char 数组。

这个堆栈溢出问题file-streaming-in-java讨论了在 java 中有效地流式传输文件。

我特别喜欢这篇参考文章

在大文件上,您很快就获得了仅使用字节的速度优势,因此如果您可以通过字节解码模式,您肯定可以获得一些宝贵的周期。

如果您的文件很小,或者您没有那么多文件,那么可能不值得麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM