c#客户端用protobuf序列化的时间很长

Eric3333 2014-09-23 12:50:33
第一次来论坛发帖,想问问各位有过使用protobuf经验的大大给点意见,不甚感激!
unity项目,客户端开10个连接,用自带的profile分析器分析后发现两个问题:
1.同一个消息类型,第一次序列化的时间是后面的两倍之多,即,第一次发送可能需要10ms,第二次只要5ms,第三、第四。。。都是5ms左右。
2.性能不达标,我在实际测试中,10个连接,就算不考虑第一次的序列化时间,后面的每一次发送前的序列化基本都要占用0.28ms/次,这个时间已经非常多了,还要考虑到异步发送等等,基本上最后发一个消息就要占用0.5ms/次-0.7ms/次,我看网上大家测的性能和我相差甚远,故怀疑是我哪里没做好。

我的做法是这样的,.proto文件中定义消息类型,我的测试消息是三个string,一个int,一个float,总共5个字段的message。然后用protoc生成代码,然后用precompile进行预编译(这里说一句,如果不预编译,直接放到项目中,第一次序列化时间更长!),最后得到的dll和protobuf-net一起放到项目中。

调用的时候也是网上能搜到的方式
MyProtobufSerializer pbs = new MyProtobufSerializer();
MemoryStream ms = new MemoryStream();
pbs.Serialize(ms, cmd);//cmd是消息

如上,profile分析器中看到的性能显示每次开销都会在protobuf里面的一个叫做SerializeCore的函数上,基本上时间都花在这上面了。。。。头疼着,找了很多资料,希望各位大侠给点方向。。。
...全文
600 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hackfantasy 2016-10-02
  • 打赏
  • 举报
回复
引用 11 楼 hackfantasy 的回复:
protobuf net内核是用反射来反序列化的,估计是因为第一次需要反射,后面用就可以复用,所以第一次花费时间较长。
另外好像有一个库不是用反射来完成反序列,效率比net稍微好点。不过名字我忘记了,你可以找找看。
hackfantasy 2016-10-02
  • 打赏
  • 举报
回复
protobuf net内核是用反射来反序列化的,估计是因为第一次需要反射,后面用就可以复用,所以第一次花费时间较长。
20150623 2015-07-17
  • 打赏
  • 举报
回复
楼主你的问题解决了吗、同样碰到你说的问题
Eric3333 2014-09-23
  • 打赏
  • 举报
回复
顶一下,希望有人能看到。。。。
Eric3333 2014-09-23
  • 打赏
  • 举报
回复
引用 7 楼 sbwwkmyd 的回复:
另外客户端确实不需要太多连接,一个足矣,而且效率最好。
非常感谢!但是目前测试进入尾声,只剩一个性能指标了,不好随便更换,希望再等其他人给点意见啥的~ 实在不行我会考虑你的建议,非常感谢!
showjim 2014-09-23
  • 打赏
  • 举报
回复
另外客户端确实不需要太多连接,一个足矣,而且效率最好。
showjim 2014-09-23
  • 打赏
  • 举报
回复
试试fastCSharp的代码生成方式,不过没有在mono/unity的真实环境下测试过。
Eric3333 2014-09-23
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
其实你是在一个线程里创建了10个连接,然后把连接对象放到了数组中而已 既然都是在同一个线程里(而且很有可能你是直接在主线程中创建的) 那么每个连接的通信等待过程,都会阻塞其他连接的正常执行
抱歉哈,新手描述难免不准确。。。 我们其实是做手游的,然后协同程序我刚查了下,好像c#是不支持的。。。只有unity引擎自带了。 其实我测的时候是没有把连接也算进去的。我只是观察他在序列化那个时刻的时间啊。。。 不知道有没有讲清楚哈,如有不对还请指正~
於黾 2014-09-23
  • 打赏
  • 举报
回复
其实你是在一个线程里创建了10个连接,然后把连接对象放到了数组中而已 既然都是在同一个线程里(而且很有可能你是直接在主线程中创建的) 那么每个连接的通信等待过程,都会阻塞其他连接的正常执行
於黾 2014-09-23
  • 打赏
  • 举报
回复
你应该先学习一下线程的概念,通信有关的代码,都放到线程里去 还有,能不能用一点专业术语,不要随便用协同什么的 数组只是保存变量用的,什么叫数组的方式创建啊
Eric3333 2014-09-23
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
unity项目,客户端开10个连接 什么意思 是10个线程吗 连接又是连接到哪里
感谢,终于有人来啦! 是一个客户端用数组的方式创建10个连接,连到公司的服务器上(内网),然后采用协同的方式来用10个连接发消息。
於黾 2014-09-23
  • 打赏
  • 举报
回复
unity项目,客户端开10个连接 什么意思 是10个线程吗 连接又是连接到哪里

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧