Msgpack能否提供更好的性能和与Python的struct.pack()相同的功能?
can msgpack provide better performance and identical functionality of python's struct.pack()?
这篇文章比较了许多序列化例程,并指出msgpack比Python的struct.pack()
和unpack((例程更快。我想使用 msgpack,但无法弄清楚如何以与struct.pack()
相同的方式将msgpack.packb()
用于浮点数或双精度数。
我需要通过 udp 从python向C/C++侦听器发送 N 个双精度值,该侦听器通过 udp/ip 读取 N 个双精度值。无法修改 C/C++ 侦听器。Pythonstruct.pack()
方法像这个剪辑一样工作得很好,用于打包 N=3 双精度:
import struct
import msgpack
packer = struct.Struct('ddd')
myTuple = (1.1, 2.2, 3.3)
packedData = packer.pack(*myTuple)
打印(打包数据(产量:
b'x9ax99x99x99x99x99xf1?x9ax99x99x99x99x99x01@ffffffn@'
然后用msgpack尝试同样的事情:
msgPackedData = msgpack.packb(myTuple)
和打印(msgPackedData(产生:
b'x93xcb?xf1x99x99x99x99x99x9axcb@x01x99x99x99x99x99x9axcb@nffffff'
输出显然不一样。udp 侦听器完美地解释了使用 struct.pack(( 发送的数据包,但我想获得 msgpack 的性能改进。
可以在产生与struct.pack()
相同的输出的同时获得味精包的性能吗?
让我们比较两个打包的二进制文件。
上排msgPackedData
,下排packedData
。
0x93 0xcb 0x3f 0xf1 0x99 0x99 0x99 0x99 0x99 0x9a 0xcb 0x40 0x01 0x99 0x99 0x99 0x99 0x99 0x9a 0xcb 0x40 0x0a 0x66 0x66 0x66 0x66 0x66 0x66
0x9a 0x99 0x99 0x99 0x99 0x99 0xf1 0x3f 0x9a 0x99 0x99 0x99 0x99 0x99 0x01 0x40 0x66 0x66 0x66 0x66 0x66 0x66 0x0a 0x40
您可以看到第一个0x93和三个0xcb。这是怎麽?
消息包包含类型信息。
0x93 表示 3 个元素的数组。 https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family
0xcb 表示大端序 IEEE 754 双精度浮点数 https://github.com/msgpack/msgpack/blob/master/spec.md#float-format-family
因此msgPackedData
比packedData
大 4 个字节。
packedData
和msgPackedData
之间的另一个区别是字节顺序。但它不会影响大小。
如果您不使用元组,并且只需打包三个双精度数,则可以删除第一个0x93。但是没有办法删除0xcb。这是以消息包格式表示双精度数的唯一方法。
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- C++Union/Struct位域的实现和可移植性
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 错误:"Left of getValue must have class/struct/union"
- 在 SVM-Struct 中未定义对 sqrt 的引用(已使用 -lm)
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 附加使用 Struct 作为"multikey"并将 std::vector 用作映射值的映射
- QML/C++/QObject Struct Copy
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth
- Msgpack能否提供更好的性能和与Python的struct.pack()相同的功能?
- C++:使用 param pack 显式调用函数重载
- 将向量传递给<struct> Lua 表
- MPI_DOUBLE_INT and C++ struct
- 如何使用 cmake pack redhat 风格的 rpm,这是主要的和"-devel"?
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- C++ code for do Python struct.pack('>I',val)
- Python's struct.pack/unpack 等价性 in C++