philhofer/fwd
GitHub: philhofer/fwd
一个比标准库 bufio 更快的 Go 缓冲读写库,通过直接暴露缓冲区内存来提升二进制协议编解码性能。
Stars: 80 | Forks: 21
# fwd
[](https://pkg.go.dev/github.com/philhofer/fwd)
`import "github.com/philhofer/fwd"`
* [概述](#pkg-overview)
* [索引](#pkg-index)
## 概述
fwd 包提供了一个带缓冲的 reader
和 writer。它们各自包含一些方法,
有助于提高某些二进制
协议的编码/解码性能。
`Writer` 和 `Reader` 类型提供了
与 `bufio` 中对应类型相似的功能,此外
还提供了一些额外的实用方法,简化了
预读和预写操作。我编写这个包是为了提高
[github.com/tinylib/msgp](https://github.com/tinylib/msgp) 的序列化性能,
对于某些工作负载,它比 `bufio` 快了大约 2 倍。
但是,必须谨慎理解该包提供的额外方法的语义,
因为它们允许用户直接访问和操作缓冲区内存。
`fwd.Reader` 的额外方法是 `Peek`、`Skip`
和 `Next`。与 `(*bufio.Reader).Peek` 不同,
`(*fwd.Reader).Peek` 会重新分配读取缓冲区,
以适应任意大小的预读操作。
`(*fwd.Reader).Skip` 会跳过流中接下来的 `n` 个字节,
如果底层流实现了 `io.Seeker` 接口,则会使用该接口。
`(*fwd.Reader).Next` 返回一个指向读取缓冲区中
接下来 `n` 个字节的切片(类似于 `Peek`),但同时也
会增加读取位置。这允许用户以任意块大小处理流,
而无需管理大小匹配的切片。此外,避免将数据从
缓冲区复制到内存中的另一个位置,可以显著提高
CPU 密集型应用程序的性能。
`fwd.Writer` 只有一个额外的方法,即 `(*fwd.Writer).Next`,
它返回一个指向 writer 接下来 `n` 个字节的切片,并将
写入位置增加所返回切片的长度。这允许用户直接写入
缓冲区的末尾。
## 可移植性
因为它使用了 unsafe 包,所以理论上
无法保证向前或向后的可移植性。
为了保持与 tinygo 0.32 的兼容性,unsafestr() 已更新,
开始按照 https://tinygo.org/docs/guides/compatibility 的建议
使用 unsafe.Slice(),这也需要更新 go.mod 以要求至少使用 go 1.20。
## 索引
* [常量](#pkg-constants)
* [type Reader](#Reader)
* [func NewReader(r io.Reader) *Reader](#NewReader)
* [func NewReaderBuf(r io.Reader, buf []byte) *Reader](#NewReaderBuf)
* [func NewReaderSize(r io.Reader, n int) *Reader](#NewReaderSize)
* [func (r *Reader) BufferSize() int](#Reader.BufferSize)
* [func (r *Reader) Buffered() int](#Reader.Buffered)
* [func (r *Reader) Next(n int) ([]byte, error)](#Reader.Next)
* [func (r *Reader) Peek(n int) ([]byte, error)](#Reader.Peek)
* [func (r *Reader) Read(b []byte) (int, error)](#Reader.Read)
* [func (r *Reader) ReadByte() (byte, error)](#Reader.ReadByte)
* [func (r *Reader) ReadFull(b []byte) (int, error)](#Reader.ReadFull)
* [func (r *Reader) Reset(rd io.Reader)](#Reader.Reset)
* [func (r *Reader) Skip(n int) (int, error)](#Reader.Skip)
* [func (r *Reader) WriteTo(w io.Writer) (int64, error)](#Reader.WriteTo)
* [type Writer](#Writer)
* [func NewWriter(w io.Writer) *Writer](#NewWriter)
* [func NewWriterBuf(w io.Writer, buf []byte) *Writer](#NewWriterBuf)
* [func NewWriterSize(w io.Writer, n int) *Writer](#NewWriterSize)
* [func (w *Writer) BufferSize() int](#Writer.BufferSize)
* [func (w *Writer) Buffered() int](#Writer.Buffered)
* [func (w *Writer) Flush() error](#Writer.Flush)
* [func (w *Writer) Next(n int) ([]byte, error)](#Writer.Next)
* [func (w *Writer) ReadFrom(r io.Reader) (int64, error)](#Writer.ReadFrom)
* [func (w *Writer) Write(p []byte) (int, error)](#Writer.Write)
* [func (w *Writer) WriteByte(b byte) error](#Writer.WriteByte)
* [func (w *Writer) WriteString(s string) (int, error)](#Writer.WriteString)
## 常量
```
const (
// DefaultReaderSize is the default size of the read buffer
DefaultReaderSize = 2048
)
```
```
const (
// DefaultWriterSize is the
// default write buffer size.
DefaultWriterSize = 2048
)
```
## type Reader
```
type Reader struct {
// contains filtered or unexported fields
}
```
Reader 是一个带缓冲的预读 reader
### func NewReader
```
func NewReader(r io.Reader) *Reader
```
### func NewReaderSize
```
func NewReaderSize(r io.Reader, n int) *Reader
```
NewReaderSize 返回一个新的 *Reader,
从 'r' 读取数据,缓冲区大小为 'n'
### func (\*Reader) BufferSize
```
func (r *Reader) BufferSize() int
```
BufferSize 返回缓冲区的总大小
### func (\*Reader) Buffered
```
func (r *Reader) Buffered() int
```
Buffered 返回当前缓冲区中的字节数
### func (\*Reader) Next
```
func (r *Reader) Next(n int) ([]byte, error)
```
Next 返回流中接下来的 'n' 个字节。
与 Peek 不同,Next 会推进 reader 的位置。
返回的字节指向与缓冲区相同的数据,
因此该切片仅在下次调用 reader 方法之前有效。
EOF 被视为意外错误。
如果返回的切片长度小于所请求的长度,
将返回一个错误,且 reader 的位置不会增加。
### func (\*Reader) Peek
```
func (r *Reader) Peek(n int) ([]byte, error)
```
Peek 返回接下来 'n' 个已缓冲的字节,
如有必要,会从底层 reader 中读取。
仅当返回错误时,它才会返回长度短于 'n' 字节的切片。
Peek 不会推进 reader。EOF 错误*不会*作为
io.ErrUnexpectedEOF 返回。
### func (\*Reader) Read
```
func (r *Reader) Read(b []byte) (int, error)
```
Read 实现了 `io.Reader`。
### func (\*Reader) ReadByte
```
func (r *Reader) ReadByte() (byte, error)
```
ReadByte 实现了 `io.ByteReader`。
### func (\*Reader) ReadFull
```
func (r *Reader) ReadFull(b []byte) (int, error)
```
ReadFull 尝试将 len(b) 个字节读取到
'b' 中。它返回读取到 'b' 中的字节数,
如果不等于 len(b) 则返回错误。
EOF 被视为意外错误。
### func (\*Reader) Reset
```
func (r *Reader) Reset(rd io.Reader)
```
Reset 重置底层 reader 和读取缓冲区。
### func (\*Reader) Skip
```
func (r *Reader) Skip(n int) (int, error)
```
Skip 将 reader 的位置向前移动 'n' 个字节。
返回跳过的字节数以及遇到的任何错误。
它类似于 Seek(n, 1)。如果底层 reader 实现了
io.Seeker,则该方法将用于向前跳过。
如果 reader 在跳过 'n' 个字节之前遇到
EOF,它会返回 `io.ErrUnexpectedEOF`。
如果底层 reader 实现了 `io.Seeker`,
则改为适用这些规则。(许多实现
在下次调用 Read 之前不会返回 `io.EOF`)。
### func (\*Reader) WriteTo
```
func (r *Reader) WriteTo(w io.Writer) (int64, error)
```
WriteTo 实现了 `io.WriterTo`。
## type Writer
```
type Writer struct {
// contains filtered or unexported fields
}
```
Writer 是一个带缓冲的 writer
### func NewWriter
```
func NewWriter(w io.Writer) *Writer
```
NewWriter 返回一个新的 writer,
它向 'w' 写入数据,并拥有一个
大小为 `DefaultWriterSize` 字节的缓冲区。
### func NewWriterBuf
```
func NewWriterBuf(w io.Writer, buf []byte) *Writer
```
NewWriterBuf 返回一个新的 writer,
它向 'w' 写入数据,并使用 'buf' 作为缓冲区。
如果容量小于 18,则不会使用 'buf',
而是分配自定义缓冲区。
### func NewWriterSize
```
func NewWriterSize(w io.Writer, n int) *Writer
```
NewWriterSize 返回一个新的 writer,
它向 'w' 写入数据,缓冲区大小为 'n'。
### func (\*Writer) BufferSize
```
func (w *Writer) BufferSize() int
```
BufferSize 返回缓冲区的最大大小。
### func (\*Writer) Buffered
```
func (w *Writer) Buffered() int
```
Buffered 返回 reader 中已缓冲的字节数。
### func (\*Writer) Flush
```
func (w *Writer) Flush() error
```
Flush 将所有已缓冲的字节刷新到底层 writer。
### func (\*Writer) Next
```
func (w *Writer) Next(n int) ([]byte, error)
```
Next 返回写缓冲区中接下来的 'n' 个空闲字节,
如有必要,会先刷新 writer。
如果 'n' 大于写缓冲区的大小,Next 将返回 `io.ErrShortBuffer`。
对 'next' 的调用会将写入位置增加
所返回缓冲区的大小。
### func (\*Writer) ReadFrom
```
func (w *Writer) ReadFrom(r io.Reader) (int64, error)
```
ReadFrom 实现了 `io.ReaderFrom`
### func (\*Writer) Write
```
func (w *Writer) Write(p []byte) (int, error)
```
Write 实现了 `io.Writer`
### func (\*Writer) WriteByte
```
func (w *Writer) WriteByte(b byte) error
```
WriteByte 实现了 `io.ByteWriter`
### func (\*Writer) WriteString
```
func (w *Writer) WriteString(s string) (int, error)
```
WriteString 类似于 Write,但它接受一个字符串。
由 [godoc2md](https://github.com/davecheney/godoc2md) 生成
标签:EVTX分析, 日志审计