用于未缓冲读取的用例

时间:2018-01-10 03:16:58

标签: ruby utf-8 io buffer

我正在为Ruby创建一组新的IO类(用作内置核心IO类的替代品)。

在重新设计这个干净的表格时,我遇到了有关缓冲与无缓冲读取IO的问题。缓冲IO具有减少系统调用次数的优点,在尝试读取和解析UTF-8时特别有用,其中char可以是1到4个字节的长度。我可以提前读取4k,解析我的编码字符串,并通过搜索修改文件指针来放回未使用的字节。

但是,从管道或套接字等流中读取时不存在此选择,因为不允许搜索。一旦我读完它们,我就无法将这些字节放回去。

所以现在我被迫一次读取1(到4)个字节来完成一个可以强制编码为UTF-8的字节串。如果我尝试进行更大的读取,我会提高字符串编码性能,但现在留下了未使用的字节。任何未使用的字节(即我读得太远)都需要"放回"或者" unget"通过将它们存储在我的IO对象中,但是现在我回到需要缓冲的IO。

所以,我想知道我的决定是否比它需要的更复杂。如果没有用于无缓冲IO的良好用例,那么我的路径很明确。如果有充足的理由可以使用无缓冲的IO,我的路径也很明确。

是否有人有一个或多个真实用例用于无缓冲读取?

1 个答案:

答案 0 :(得分:0)

经过多次反复思考后,我认为没有令人信服的用例需要无缓冲读取。因此,我的IO类将默认缓冲读取并尝试满足来自该缓存的读取请求。对于Block和Stream对象都是如此。

然而,出现了一个有趣的细节。读缓存可能是32k左右。有时用户会尝试读取超过该大小的内容。在那种情况下,缓存检测到大的读取,使自身无效,然后将读取请求传递给执行无缓冲读取的__read__“原语”。通过选择将半私有读取作为API的一部分提供,用户可以完全绕过读取缓存并进行直接无缓冲读取。

因此,我会在不混乱API的情况下提供两全其美的优势。