三种DBus传输数据的方式的比较

本文深入探讨了基于DBus的三种数据传输方法:直接函数调用、基于GVariant的DBus数据直接传递以及基于ShareMemory的数据传递。通过实测对比,揭示了各自在性能上的优劣,并详细阐述了每种方法的实现原理与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列出基于DBus的三种传输数据所使用的时间数据,依赖于具体平台,仅供参考。

测试数据是传输一个U盘目录下的32766个文件的全路径与文件名,数据总大小在1.5MB以下。

1. 直接函数调用

这个基于DBus应用的最直接实现,一次函数调用,返回分别为全路径与文件名的2个字符串,数据量不超过40字节,整体性能受限于单次DBus函数的执行时间。在我的测试平台上,单次DBus的函数调用在4ms以上(还是Peer to Peer)的,因此,所有数据传输完成的时间是130多秒。。。,性能完全不能满足要求;

2. 基于GVariant的DBus数据直接传递

GDBus支持在Bus上直接传递结构体数组。定义DBus接口时,声明参数是"a(ss)"类型,即由俩个字符串构成的结构体的数组,而实际在Bus上传递的是一个GVariant对象。这种方式在DBus上传输时会遇到数据封包的限制:DBus上最大的数据包为32KB,因此一个GVariant对象可能会被拆成多个DBus数据包,因此导致额外的负载。在我的测试平台上,GVariant化后的总数据大小在2MB多,总的封装GVariant+解封装GVariant+DBus数据传输的时间是11s左右,比直接函数调用降了一个数量级;

3. 基于Share Memory的数据传递

由于GVariant对象的数据可以很容易的序列化,因此可以使用在DBus接口中封装共享内存的方式,省去在DBus上传输、拷贝数据的时间。测试后的时间花费在5.5秒左右,主要消耗在数据的打包与解包上,对于一个通用的序列化算法来说,似乎没有再优化的空间了。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值