cloudwu / sproto

Yet another protocol library like google protocol buffers , but simple and fast.
MIT License
942 stars 253 forks source link

tag的作用和map的实现上面不太理解 #53

Open owen200008 opened 8 years ago

owen200008 commented 8 years ago

感谢你的建议我也看了你5.3的中文文档,对我这个初学者很有帮助 另外sproto源码我看了然后昨天做了一次改版,里面有几个不太理解 1.tag的作用?除了实现option的功能外,是否还有其他用途? 2.map支持的局限性,是否考虑增加通用类型map? 目前我是改版支持任意类型的map结构不一定依赖于struct,以及里面的key定义(我们的项目中很多定义是 key 到 基础类型 的map) 另外修改lpeg使用C的struct定义,这样我觉得更能表示他和c的关系(其实也是为了偷懒,复制粘贴二进制的协议定义,支持字节对齐1,2,4,8,string,vt和map) 主要了解下map的以后发展,另外如果可以的话是否这样实现的通用类型map是否会有其他问题 encode{ ... if (args->index > 0) { ... if (args->m_pMapKeyType > 0) { ... lua_pushvalue(L, self->iter_index); --根据类型读取key值 lua_pop(L, 1); } } ... }

decode{ ... if (args->index != 0) { ... if (args->m_pMapKeyType > 0){ //map,先压入key lua_Integer v = *args->m_pMapKeyValue; lua_pushinteger(L, v); } } ... if (args->index > 0) { if (args->m_pMapKeyType > 0) { //map lua_settable(L, self->array_index); } else { //array lua_seti(L, self->array_index, args->index); } } else { lua_setfield(L, self->result_index, args->tagname); } } 主要是lua这里实现是否会引发其他问题?

cloudwu commented 8 years ago

现在能达到描述数据结构的需要,不会改。 如果你不需要数据的 schema, 建议换成无 schema 的协议,例如 json

owen200008 commented 8 years ago

我以前是做金融的,金融传输用FAST协议所以我不太喜欢json这种自描述的,习惯有一份模板就处理数据 另外就是lua的代码还没看所以目前一个问题请教下,我对比了pbc-binding sproto 还有自己写的一套类似pbc-binding的 bitstream 发现性能基本都消耗在 C和lua之间的接口调用上面,sproto实现一次lua调用c执行2000万次调用大概10秒,pbc和我的bitstream调用3次时间就在40s左右,这部分时间有优化的手段吗?或者介绍类似相关的资料给我 谢谢~

owen200008 commented 8 years ago

可能我说的不清楚就是我写了一个测试包 3个段,因此pbc和我的bitstream都调用c 3次-4次,sproto只调用一次encode,发现效率绝大部分都消耗在调用上面,注释掉代码时间大概也就降低到7s,这块大的性能消耗相关资料和优化手段我需要深入研究下,如果有资料介绍给我非常感谢~

cloudwu commented 8 years ago

划分清两个语言的边界是非常重要的。性能应该放在第二位。

所以,应该尽量减少 FFI 调用。