提问人:唐子玄 提问时间:4/5/2022 更新时间:11/11/2022 访问量:494
Okio 与 java.io 性能
Okio vs java.io performance
问:
我阅读了以下博客: https://medium.com/@jerzy.chalupski/a-closer-look-at-the-okio-library-90336e37261
据说” 汇和源通常连接到管道中。Square的聪明人意识到,没有必要像 java.io 缓冲流那样在这样的管道组件之间复制数据。所有源和接收器都使用后台缓冲区,而缓冲区将数据保存在段中,因此通常您可以从一个缓冲区中获取整个段并将其移动到另一个缓冲区。
我只是不明白 java.io 中的数据副本在哪里。
在这种情况下,一个 Segment 将被移动到另一个 Buffer。
在我阅读了Okio的源代码之后。如果通过 Okio 将字符串写入文件,如下所示:
val sink = logFile.appendingSink().buffer()
sink.writeUtf8("xxxx")
不会有“将段移动到另一个缓冲区”。我说得对吗?
答:
Java 只是一个将数据缓冲到缓冲区中的方法——缓冲区是 ,或类似的东西——所以每次你需要从中获取一堆字节/字符时,它不需要从文件/网络/任何你的字节源中读取字节(只要它缓冲了足够的字节)。A 执行相反的操作:每当你向 写入一堆字节时,它实际上不会将字节写入文件/套接字/其他任何东西,而是将它们“停放”到缓冲区中,这样它才能在缓冲区装满时才能使用缓冲区。
总体而言,这最大限度地减少了对文件/网络/任何东西的访问,因为它可能很昂贵。BufferedReader
Reader
char[]
BufferedWriter
BufferedWriter
flush
当您通过管道将 a 传递给 a 时,您实际上有 2 个缓冲区。Java 如何将字节从一个缓冲区移动到另一个缓冲区?它使用(或等效的东西)将它们从源复制到接收器。一切正常,只是复制一堆字节需要一定的时间,该时间会随着缓冲区大小的增长而线性增长。因此,复制 1 MB 大约需要 1000 倍的时间是复制 1 KB 的 1000 倍。BufferedReader
BufferedWriter
System.arraycopy
另一方面,Okio 实际上并不复制字节。过度简化它的工作方式,Okio 有一个带有实际字节的单个字节,唯一从源移动到接收器的是指向 的指针(或引用),无论其大小如何,它都需要相同的时间。byte[]
byte[]
评论
InputStream
评论