内置追加与字节。缓冲区写入

威廉·普西耶:

在需要向一个字节的切片中添加未知数量的数据的情况下,让我们在循环中说,我可以使用内置函数append()或创建新函数Buffer并使用该Write()函数。

哪种方法最快?

用户6169399:

这取决于用例。
在这两种情况下,这里的bytes.Buffer速度都快于append(示例:1、2、3、4)。

使用buf.Write(make([]byte, 16))需要4.6482659s
使用buf = append(buf, make([]byte, 16)...)需要6.6623811s

对于样本5、6:
使用buf = append(buf, byte(i))汇整445.0255ms
使用buf.WriteByte(byte(i))汇整1.4410824s


bytes.Buffer使用内置功能copy并且速度很快:

// Write将p的内容附加到缓冲区,并根据
需要扩展缓冲区返回值n是p的长度;错误始终为零。如果
//缓冲区太大,则Write将因ErrTooLarge感到恐慌。

func (b *Buffer) Write(p []byte) (n int, err error) {
  b.lastRead = opInvalid
  m := b.grow(len(p))
  return copy(b.buf[m:], p), nil
}

bytes.Buffer花费4.8892797s和append7.7514434s

请参阅以下基准:

1-使用append

package main

import (
    "fmt"
    "time"
)

func main() {
    buf := []byte{}
    data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf = append(buf, data...)
    }
    fmt.Println(time.Since(t))
    fmt.Println(len(buf))
}

输出:

7.7514434s
1600000000

2-使用 bytes.Buffer

package main

import (
    "bytes"
    "fmt"
    "time"
)

func main() {
    buf := &bytes.Buffer{}
    data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf.Write(data)
    }
    fmt.Println(time.Since(t))
    fmt.Println(buf.Len())
}

输出:

4.8892797s
1600000000

3- bytes.Buffer与结合使用make([]byte, 16)

package main

import (
    "bytes"
    "fmt"
    "time"
)

func main() {
    buf := &bytes.Buffer{}
    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf.Write(make([]byte, 16))
    }
    fmt.Println(time.Since(t)) // 4.6482659s
    fmt.Println(buf.Len())     //1600000000
}

4- appendmake([]byte, 16)

package main

import (
    "fmt"
    "time"
)

func main() {
    buf := []byte{}
    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf = append(buf, make([]byte, 16)...)
    }
    fmt.Println(time.Since(t)) // 6.6623811s
    fmt.Println(len(buf))      // 1600000000
}

5-使用buf = append(buf, byte(i))需要445.0255ms

package main

import (
    "fmt"
    "time"
)

func main() {
    buf := []byte{}
    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf = append(buf, byte(i))
    }
    fmt.Println(time.Since(t)) // 445.0255ms
    fmt.Println(len(buf))      // 100000000
}

6-使用buf.WriteByte(byte(i))需要1.4410824s

package main

import (
    "bytes"
    "fmt"
    "time"
)

func main() {
    buf := &bytes.Buffer{}

    t := time.Now()
    for i := 0; i < 100000000; i++ {
        buf.WriteByte(byte(i))
    }
    fmt.Println(time.Since(t)) // 1.4410824s
    fmt.Println(buf.Len())     // 100000000
}

并参阅:

附加片性能差..为什么呢?
append()实现在哪里?
有效地附加到可变长度的字符串容器(Golang)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章