首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Okio与java.io性能

Okio与java.io性能
EN

Stack Overflow用户
提问于 2022-04-05 09:51:57
回答 1查看 228关注 0票数 1

我读了以下博客:https://medium.com/@jerzy.chalupski/a-closer-look-at-the-okio-library-90336e37261

据说,“汇和源经常连接到管道中。Square的聪明人意识到,没有必要复制类似java.io缓冲流这样的管道组件之间的数据。所有源和水龙头都使用遮罩下的缓冲区,缓冲器将数据按段保存,因此通常只需将整个段从一个缓冲区转移到另一个缓冲区。”

我只是不明白java.io中的数据副本在哪里。

在这种情况下,段将被移动到另一个缓冲区。

在我读了Okio的源代码之后。如果将字符串写入Okio文件,如下所示:

代码语言:javascript
复制
val sink = logFile.appendingSink().buffer()
sink.writeUtf8("xxxx")

将不会有“移动段到另一个缓冲区”。我说的对吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-30 14:59:55

Java的BufferedReader只是一个将数据缓冲到缓冲区中的Reader --缓冲区是char[],或者类似的东西--这样,每次您需要从缓冲区中读取字节/字符时,它就不需要从文件/网络/任何字节源读取字节(只要它已经缓存了足够多的字节)。BufferedWriter会执行相反的操作:每当您向BufferedWriter写入一堆字节时,它实际上并不会将字节写入文件/套接字/任何东西,但它会将它们“存储”到缓冲区中,以便只有在缓冲区满时才能将缓冲区保存。总的来说,这将文件/网络/任何东西的访问降到最低,因为它可能很昂贵。

当您将一个BufferedReader输送到一个BufferedWriter时,您实际上有两个缓冲区。Java如何将字节从一个缓冲区移动到另一个缓冲区?它使用System.arraycopy (或类似的东西)将它们从源复制到接收器。所有操作都很好,除了复制一组字节需要的时间随着缓冲区大小的增长而线性增长。因此,复制1MB将花费大约1000倍于复制1KB。

另一方面,Okio实际上并不复制字节。Okio过度简化了它的工作方式,Okio有一个带有实际字节的byte[],唯一从源移动到接收器的是指向该byte[]的指针(或引用),不管它的大小如何,它都需要相同的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71749653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档