FIFO和Binder讀取資料效率測試對比結果

2021-06-21 23:52:39 字數 3497 閱讀 2137

最近應領導蛋疼的需求對binder和fifo做一次測試對比,並給出測試資料,所以簡單寫了fifo和binder的測試對比程式,拿到了對比結果;

由於有個專案需要程序間傳輸資料,之前在網上檢視了一些資料,了解了一些binder的實現原理,覺得binder傳輸效率應該是比fifo高的,於是就用binder實現了;但是領導對binder一無所知,覺得binder不靠譜,要求我在專案實現中fifo和binder共用,fifo傳輸資料流,binder做fifo傳輸的同步控制,由於是在linux平台上用c實現,binder那一套移植過來本來就費事兒,一聽就覺得反感,完全是多此一舉,沒事找事兒,再說怎麼也輪不到這兩個共用,binder大材小用,冗餘又麻煩;個木腦殼,給他解釋也沒用,說什麼要拿測試對比資料說話,慪上氣了,最後帶著情緒做了套測試,但卻得到了一些吃驚的結果:

測試環境:linux平台,

以下是測試**,比較粗糙;

fifo測試**:(注:fifo**可以直接編譯執行)

client.c:

/*fifl_read.c*/

#include #include #include #include #include #include #include #include#include#define fifo "/tmp/myfifo"

#define read_data_len 4096

main(int argc,char** argv)

sleep(5);

gettimeofday (&tv , &tz);

printf("nindex is %d, nnum = %d, tv_sec;test0 %d\n",nindex, nnum, tv.tv_sec);

printf("nindex is %d,「nnum = %d, tv_usec;test0 %d\n",nindex, nnum, tv.tv_usec);

for(nindex = 0; nnum < 1024 * 1024 * 1024; nindex++)

nnum += nread;

} gettimeofday (&tv , &tz);

printf("nindex is %d,「nnumb = %d, tv_sec;test1 %d\n",nindex, nnum, tv.tv_sec);

printf("nindex is %d,「nnumb = %d, tv_usec;test1 %d\n",nindex, nnum, tv.tv_usec);

pause();

unlink(fifo);

}

server.c:

#include #include #include #include #include #include #include #define fifo "/tmp/myfifo" 

#define write_data_len 4096

main(int argc,char** argv)

/*引數為即將寫入的位元組數*/

}printf("write fifo nindex is %d\n", nindex);

}

binder測試**:(注:binder**只有部分關鍵點,無法直接編譯執行)

client.c

#include #include #include #include #include #include #include #include #include #include "tspushermanager/tspushermanager.h"

#define read_data_len 4096

int main(int argc, char **argv)

gettimeofday(&tvafter, &tz);

printf("nindex is %d, nnum = %d, tv_sec;test1 %d!\n",nindex, nnum, tvafter.tv_sec);

printf("nindex is %d, nnum = %d, tv_usec;test1 %d!\n",nindex, nnum, tvafter.tv_usec);

manager->close(pvtspusher);

return 0;

}

server.c
#include #include #include #include #include #include "tspushermanagerservice.h"

#define write_data_len 4096

static char s_acdata[write_data_len];

int main(int argc, char **argv)

void *open(csdvbtspusheropenparam_s *psparam)

int read(void *pvtspusher, char *pcbuffer, int nlen)

int close(void *pvtspusher)

對比結果:

讀取1g bytes,binder每次讀取資料為4k bytes,fifo每次讀寫的資料都是4k bytes,管道單工模式,總

耗時統計:

fifo: 

2s左右

速率為500m bytes每秒

1.8s496086次

1.55s354749次

1.4s306684次

1.52s340999次

注:單工模式讀取次數應該為(262144 * 2)次,由於讀寫程序是手動啟動,讀寫程序有先後啟動關係,不是同時開始對管道操作,所以得到的測試資料無法準確體現讀取(262144 * 2)次,得到的結果也是預估出來的,應該沒什麼大的誤差。

binder:

31s左右

速率為32m bytes每秒

strcpy()

31.5s262144次

31.0s262144次

30.9s262144次

30.9s262144次

memset()

24s左右速率為50m bytes每秒

24.9s262144次

24.2s262144次

24.1s262144次

24.1s262144次

24.2s262144次

注:strcpy()和memset()表示binder的server傳資料時呼叫的函式,由於不相信binder與fifo這麼大的差距,懷疑是這個地方太耗時,所以。。。

總結:這個結果讓我大吃一驚,都不願意相信fifo會是binder的10倍,抱著懷疑的態度,重複測了好多次,結果還是這樣,雖然binder滿足我專案上的需求,但還是對於網上資料給出的binder效率比fifo高有太多不可思議,想不通,如果哪位有更好的結果或解釋,請告知我一下。

binder的機制和原理

binder的作用 binder是實現不同程序之間的通訊。binder的意義 binder是乙個驅動,工作在linux層面,並且是在核心中執行。它的操作完成是基於一段記憶體。所以程式中對binder的使用都是通過系統的呼叫完成的。binder的組成 server端 client端 binder驅動端...

Android 中的AIDL 和 binder機制

2.1 初識bindler android程序間的通訊基於binder機制,binder並非linux系統標準的通訊機制,android系統選定binder這種機制實現程序間通訊基於以下幾個考慮 1,效率高。相對於低效的socket,兩次複製的管道,使用了記憶體對映的binder效率高,只需一次複製...

資料演算法中的棧和佇列(FIFO)

1.棧 棧是特殊的線性表,順序儲存 typedef int elemtype struct stack elemtype data maxsize int top 存放棧頂指標 bool initstack stack s 初始化乙個棧 bool pushstack stack s,elemtype...