philhofer/fwd

GitHub: philhofer/fwd

一个比标准库 bufio 更快的 Go 缓冲读写库,通过直接暴露缓冲区内存来提升二进制协议编解码性能。

Stars: 80 | Forks: 21

# fwd [![Go Reference](https://pkg.go.dev/badge/github.com/philhofer/fwd.svg)](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分析, 日志审计