1. 程式人生 > >三種DBus傳輸資料的方式的比較

三種DBus傳輸資料的方式的比較

列出基於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秒左右,主要消耗在資料的打包與解包上,對於一個通用的序列化演算法來說,似乎沒有再優化的空間了。


相關推薦

DBus傳輸資料方式比較

列出基於DBus的三種傳輸資料所使用的時間資料,依賴於具體平臺,僅供參考。測試資料是傳輸一個U盤目錄下的32766個檔案的全路徑與檔名,資料總大小在1.5MB以下。 1. 直接函式呼叫 這個基於DBus應用的最直接實現,一次函式呼叫,返回分別為全路徑與檔名的2個字串,資料量

十一 Struts2的資料封裝方式

Struts2的資料封裝:Struts2是一個web層框架,框架是軟體的半成品。提供了資料封裝的基本功能。 屬性驅動:提供屬性set方法的方式 這種方式很少用,除非資料少,需要在Action類裡自己往物件裡封裝 前端jsp: 1 <%@ page language="java" cont

Hive不同的資料匯出的方式

Hive三種不同的資料匯出的方式 1、匯出到本地檔案系統 insert overwrite local directory '/home/anjianbing/soft/export_data/app_order_city_d' row format delimited fiel

執行緒同步方式比較

1、互斥物件和事件物件屬於核心物件,利用核心物件進行執行緒同步,速度比較慢,但是利用核心物件,可以在多個程序的多個執行緒之間進行執行緒同步。2、關鍵程式碼段是工作在使用者方式下,同步速度比較快,但容易產生死鎖,因為在等待進入關鍵程式碼段時,無法設定超時值。一般在進行多執行緒程

JSP頁面跳轉方式比較

使用JSP大約有下列三種跳轉方式: 1. response.sendRedirect(); 2. response.setHeader("Location",""); 3. <jsp:forward page="" /> 經過試驗得到下面的一些規則: 一. r

android加載圖片方式

factor trac turn post static col ati 三種 sam package smalt.music.utils; import android.graphics.Bitmap; import android.graphics.Bitm

Openvz/KVM/Xen常見VPS虛擬化技術比較

更多 創建 半虛擬化 war 說明 文件 body 折騰 動態 mjj 剁機器時一般都會關心下超售情況,這裏簡要說明下各虛擬化技術超售能力。 KVM 不可超售資源:內存,硬盤空間 內存:KVM 在分配內存時是完全獨占的,也就是說母雞不能生出內存大於總物理內存的小雞。硬盤:

SSO單點登錄情況的實現方式詳解

否則 post請求 登錄用戶 搭建集群 本地 sub 簡單的 div nmp 單點登錄(SSO——Single Sign On)對於我們來說已經不陌生了。對於大型系統來說使用單點登錄可以減少用戶很多的麻煩。就拿百度來說吧,百度下面有很多的子系統——百度經驗、百度知道、百度文

Qt中解析xml的方式

處理異常 AR ttr omd ostream odin move encoding efault 在下面的隨筆中,我會根據xml的結構,給出Qt中解析這個xml的三種方式的代碼。雖然,這個代碼時通過調用Qt的函數實現的,但是,很多開源的C++解析xml的庫,甚至很多其他語

Selenium彩蛋篇-等待的使用方式

自動化 mes 存在 enable any 優點 網頁 定時 cal 轉: http://www.imdsx.cn/index.php/2017/07/27/ec/ 在UI自動化測試中,必然會遇到環境不穩定,網絡慢的情況,這時如果你不做任何處理的話,代碼會由於沒有找到元

c++中參數引用方式

例子 機制 string ret 調用 esp roc tor cpp 傳值調用 是默認的參數傳遞機制,實參會復制給形參,調用的語義是每次取得實參的副本並將該復本用作形參,即會有復本的開銷,並且不改變實參的值。 適用於:傳值調用用於不應該被函數改變的小型對象。 例子:voi

Selenium等待的使用方式

自動化框架 time bsp 定時 什麽 exception expect 建議 執行 在UI自動化測試中,必然會遇到環境不穩定,網絡慢的情況,這時如果你不做任何處理的話,代碼會由於沒有找到元素,而報錯。這時我們就要用到wait(等待),而在Selenium中,我們可以用到

RocketMQ專題2:常用生產消費方式(順序、廣播、定時)以及順序消費源碼探究

channel quest 再次 指定 conf 默認 廣播 body tag 順序、廣播、定時任務 前插 ? 在進行常用的三種消息類型例子展示的時候,我們先來說一說RocketMQ的幾個重要概念: PullConsumer與PushConsumer:主要區別在於Pul

例項化bean方式——Spring對bean的管理(一)

三種例項化bean方式——Spring對bean的管理(一) Spring容器提供了三種對bean的例項化方式: 1)構造器例項化 2)靜態工廠方法例項化 3)例項工廠方法是例項化 構造方法例項化 先建一個Demo實體類 public class Demo { p

Java獲得class的方式

City是一個普通的pojo public class TestClass { public static void main(String[] args) { City city = new City(); Class c1 = City.class;

XML、JSON、YAML 資訊標記形式的比較

XML:最早的通用資訊標記語言,可擴充套件性好,但繁瑣。 JSON:資訊有益型,適合程式處理(javascript),較xml簡潔。 YAML:資訊無型別,文字資訊比例最高,可讀性好。 XML:Extensible Markup Language(<,>,^,/,? 

線索化二叉樹(附非遞迴方式遍歷二叉樹)

資料結構二叉樹這快學的雲裡霧裡,所以就寫歌c++樹的類來將這寫東西全部封裝起來,想用那個直接呼叫方法,我決免費將這個大類提供給大家,提供學習上的參考,少走彎路,由於程式碼比較多,我就將各方法的功能做了註釋,如果那有什麼不懂的,可以交流。線面就是原始碼了~~~ tree.h #ifnd

Vue的常用傳值方式、父傳子、子傳父、非父子元件傳值

Vue常用的三種傳值方式有:1.父傳子 2.子傳父 3.非父子傳值  父子元件的關係可以總結為 prop 向下傳遞,事件向上傳遞。父元件通過 prop 給子元件下發資料,子元件通過事件給父元件傳送訊息。 1. 父元件向子元件進行傳值 父元件: <temp

Vue2.0的常用傳值方式、父傳子、子傳父、非父子元件傳值

在Vue的框架開發的專案過程中,經常會用到元件來管理不同的功能,有一些公共的元件會被提取出來。這時必然會產生一些疑問和需求?比如一個元件呼叫另一個元件作為自己的子元件,那麼我們如何進行給子元件進行傳值呢?如果是電商網站系統的開發,還會涉及到購物車的選項,這時候就會涉及到非父子元件傳值的情況。當然你也可以

RocketMQ專題2:常用生產消費方式(順序、廣播、定時)以及順序消費原始碼探究

順序、廣播、定時任務 前插 ​ 在進行常用的三種訊息型別例子展示的時候,我們先來說一說RocketMQ的幾個重要概念: PullConsumer與PushConsumer:主要區別在於Pull與Push的區別。對於PullConsumer,消費者會主動從broker中拉取訊息進行消費。而對於PushCon