关于go:gothrift-一-go版thrift性能优化项目

69次阅读

共计 2252 个字符,预计需要花费 6 分钟才能阅读完成。

起源:《gothrift 一 go 版 thrift 性能优化我的项目》

thrift 目前最新的版本是 0.19.0
调优之后我的项目 gothrift:https://github.com/donnie4w/gothrift

这个我的项目不会做特地大的批改,只针对特地影响性能的中央做批改,影响小的不改,性能不改,其余更新争取与官网同步更新,gothrift 应用形式与官网 thrift 一样,把库门路换成 ”github.com/donnie4w/gothrift/thrift” 即可

目前优化测试成果,gothrift 反序列化效率为原 thrift 的 3 倍以上,内存占比为 原 thrift 的 10% 以下。

网络传输效率 视不同参数构造有不同体现,某些数据结构下,gothrift 传输效率超过原 thrift 10 倍。


事实上,目前 go 版本的 thrift 序列化性能总体曾经十分好。可能有一些写法的问题会导致序列化没有达到应该有的成果
比方 go,间接用 thrift 提供的 TSerialize 来写序列化:

t := thrift.NewTSerializer()
pf := thrift.NewTCompactProtocolFactoryConf(tconf)
t.Protocol = pf.GetProtocol(t.Transport)
_r, _ = t.Write(context.Background(), ts)  //ts 为 struct

从 t.Write 的实现源码能够看到,真正实现序列化的 是 msg.Write(ctx, t.Protocol)
而 t.Write 办法最初返回的 b = append(b, t.Transport.Bytes()…) 相当于把序列化的后果拷贝了一份,这个可能是数据安全性方面的思考,不过按 thrift 序列化的实现,在序列化时,数据曾经通过一次拷贝,没有平安问题。

go 写 thrift 序列化集体的通常的写法都是:

buf := &thrift.TMemoryBuffer{Buffer: bytes.NewBuffer([]byte{})}
protocol := thrift.NewTCompactProtocolConf(buf, tconf)
ts.Write(context.Background(), protocol)
protocol.Flush(context.Background())
_r = buf.Bytes()

这个写法同样实用于其余语言
比方 java

TMemoryBuffer tmb = new TMemoryBuffer(1024);
ts.write(new TCompactProtocol(tmb));
return tmb.getArray();

比方 python

def TEncode(ts):
    tmb = TMemoryBuffer()
    ts.write(TCompactProtocol(tmb))
return tmb.getvalue()

我测试了 protobuf,thrift,go/json,msgpack 等序列化框架,从序列化测试后果来看,thrift 的序列化性能最好,反序列化性能最差

不过我没有全面测试,我次要针对我我的项目中用到的类型:整型 64 位,32 位,16 位,8 位,字符串,bool,binary, list,map

很多序列化的测试报告可能会比拟全面,序列化中,类型转换自身对序列化的影响至关重要,如果只是简略测试一两个数据类型,而且赋值时赋很少的数据,比方 ”1″,”a”, 相似这样测试进去的后果可能与理论业务中体现进去的后果天壤之别。而且测试报告只是针对本次具体环境的测试,不应该推导到全副状况,甚至推导到其余编程语言.

从设计上来看,集体认为 thrift 的序列化设计模式是优于 protobuf 的,抛开类型转换算法的优劣,它的性能理当优于 protobuf。不过理论测试时,反序列化的后果与我设想相差微小,看看以下的测试数据:


thrift 版本是 0.19.0
测试后果

压测的数据阐明:

  1. 第一是 MsgPack,也是序列化框架,能够看出,它的性能也相当不错
  2. 第二是 go 自带的 json 库,能够看到其实它序列化的性能很好,反序列化性能比拟差。
  3. 第三是 thrift,能够看出序列化方面,无论是性能还是内存占用 thrift 体现十分好,然而反序列化比拟蹩脚,性能差,占用内存大,比别的框架大了一个数量级。
  4. 第四是 protobuf,protobuf 在性能方面始终很好,从后果看,综合来说,protobuf 还是最好的。

以下 gothrift 性能优化之后的测试后果

能够看到,其余框架测试后果与之前相差不大。

thrift 反序列化优化成果比拟显著:

耗时比照:4455ns,4382ns -> 1333ns,1393ns
分配内存比照:10464B -> 976B
性能超过 3 倍,内存耗费也降一个数量级

与其余框架比拟中,无论序列化还是反序列化,thrift 性能体现都是最好的。

thrift 的网络传输问题,在这篇文章中有阐明《thrift 的网络传输性能和须要留神的问题》,gothrift 所优化的是现 thrift 存在的问题,达到网络传输效率优化成果。

gothrift 除了性能优化,也优化局部网络传输的实现,使其更适宜海量高并发数据的传输。

gothrift 主旨是优化性能,不改性能,及时与官网同步更新。如果官网实现更加优良时,随时能够切换到官网包。

测试程序源码与后果数据


有任何问题或倡议请 Email:donnie4w@gmail.com 或 https://tlnet.top/contact 发信给我,谢谢!

正文完
 0