如何高性能的组合[]byte?

admin87 · 2017-11-17 08:55:05 · 2148 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-17 08:55:05 的主题,其中的信息可能已经有所发展或是发生改变。

现在在学习GOLANG 需要组合多个[]byte. 现在在使用bytes.buffer.Write的方法 。 想咨询一下有没有比这个性能更好的办法 谢谢

下面两个方法为数据包的拆分与组合,拆分的数据包定长,但内部记录有效数据长度。想用在SOCKET多任务传送数据上。 在测试时发现一个问题, 一个68M的文件, 在拆分时用50MS 但在组合时要用150MS 想求各位大神看看有没有更好的提高性能办法。

顺便问一下,如何发代码?????????

//这个方法 是将一个大的数据,拆分多个小包,保存到MAP里。pKey为每个包的KEY。。
func CreatePacket(t int16,data []byte)([]byte,int){

    pDL:=1024*512-32
    length:=len(data)
    //计算拆包总数
    count:=int(length/pDL)
    if length % pDL>0{
        count++
    }
    bType:=Int16ToBytes(t)
    taskID:=uuid.NewV4().Bytes()
    bCount:=IntToBytes(count)
    bVerify:=make([]byte,2,2)
    for i:=0;i<count;i++{
        bIndex:=IntToBytes(i)
        sIndex:=i*pDL
        eIndex:=sIndex+pDL
        if i==count-1 {
            eIndex=length
        }
        pData:=data[sIndex:eIndex]
        dLength:=len(pData)
        bSpace:=make([]byte,pDL-dLength,pDL-dLength)
        bPacket:=BytesCombine(bType,IntToBytes(dLength),taskID,bCount,bIndex,bVerify,pData,bSpace)
        pKey:=b64.StdEncoding.EncodeToString(BytesCombine(taskID,bCount,bIndex))
        packetList.Add(pKey,bPacket)
    }
    return taskID,count
}
//这个为从MAP里取出数所包,组合到一起
func ParsePacket(taskID []byte,count int)([]byte){

    bCount:=IntToBytes(count)
    data:=new(bytes.Buffer)
    for i:=0;i<count;i++{
        bIndex:=IntToBytes(i)
        pKey:=b64.StdEncoding.EncodeToString(BytesCombine(taskID,bCount,bIndex))
        bPacket:=packetList.Dequeue(pKey)
        dLength:=BytesToInt(bPacket[2:6])
        pData:=bPacket[32:32+dLength]
        data.Write(pData)
    }
    return data.Bytes()
}

//BytesCombine 多个[]byte数组合并成一个[]byte

func BytesCombine(pBytes ...[]byte) []byte {

    return bytes.Join(pBytes, []byte(""))
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2148 次点击  
加入收藏 微博
2 回复  |  直到 2017-11-20 01:08:05
czxichen
czxichen · #1 · 7年之前

知道合并之后大小的话可以直接make一个目标大小的[]byte然后往里面copy试试

admin87
admin87 · #2 · 7年之前
czxichenczxichen #1 回复

知道合并之后大小的话可以直接make一个目标大小的[]byte然后往里面copy试试

谢谢,一会试试COPY

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传