在需要向一个字节的切片中添加未知数量的数据的情况下,让我们在循环中说,我可以使用内置函数append()
或创建新函数Buffer
并使用该Write()
函数。
哪种方法最快?
这取决于用例。
在这两种情况下,这里的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和append
7.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- append
与make([]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
}
并参阅:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句