Golang 中国

读写bytes.Buffer结构,数据量56B,重复执行200万次需要5秒,速度只有21MBps,感觉速度非常慢,不知道是什么原因。
代码如下:(不知道如何关闭markdown,也无法加入代码模式,格式比较乱=.=)

package main

import (
    "fmt"
    "encoding/binary"
    "bytes"
)

var MAGIC_NUM uint16 = 0xABCD

type BinMsgField struct {
    version uint16
    length  uint16
    random  uint16
    body    [50]byte
}
func main(){
    for i:=0;i<10000*200;i++ {
        test()
    }
    fmt.Printf("done\n")
}

func test() {
    var bm BinMsgField
    bm.version=1
    copy(bm.body[:], []byte("ABCDEF0123456789ZXC123456"))
    bm.length=997
    buf := new(bytes.Buffer)
    binary.Write(buf, binary.LittleEndian, MAGIC_NUM)
    binary.Write(buf, binary.LittleEndian, bm.version)
    binary.Write(buf, binary.LittleEndian, bm.length)
    binary.Write(buf, binary.LittleEndian, bm.random)
    binary.Write(buf, binary.LittleEndian, bm.body)

    var bm2 BinMsgField
    var mn uint16 
    binary.Read(buf, binary.LittleEndian, &mn)
    binary.Read(buf, binary.LittleEndian, &bm2.version)
    binary.Read(buf, binary.LittleEndian, &bm2.length)
    binary.Read(buf, binary.LittleEndian, &bm2.random)
    binary.Read(buf, binary.LittleEndian, &bm2.body)
}

jimmykuu 于 2017-10-11 22:33 修改
2 回复
heimeil
#1 heimeil • 2017-10-12 12:40

bytes.Buffer是内存多快就有多快,你这主要耗时在大小端转换上,吃的是CPU

binary.Write(buf, binary.LittleEndian, bm.body)
binary.Read(buf, binary.LittleEndian, &bm2.body)

body不是数值类型或其他特殊内容,只是普通数据的话,直接写进去就行了buf.Write(bm.body[:])

一般多平台的大小端差异只体现在数值类型上,其他类型的数据一般不必做转换,除非你想做一些特殊操作。

konica
#2 konica • 2017-10-14 12:29

mark一下

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。