Python 3.5+ 如何對Zero-Copy的使用

zero copy: 零拷貝。提高性能。
一個將本地文件傳遞到遠(yuǎn)程套接字的典型方法包括以下步驟:

      (1)將數(shù)據(jù)從存儲介質(zhì)中讀取到OS的頁面緩存中
      (2)將緩存數(shù)據(jù)復(fù)制到應(yīng)用程序緩沖區(qū)
      (3)復(fù)制應(yīng)用程序緩存區(qū)到另一個內(nèi)核緩沖區(qū)
      (4)將內(nèi)核緩存區(qū)發(fā)送到socket。

這個過程包括4次復(fù)制和2次系統(tǒng)調(diào)用。在Linux和Unix的操作系統(tǒng)下,有一個sendfile API可以直接將將文件通道中的字節(jié)傳輸?shù)教捉幼滞ǖ?,這可以減少在(2)和(3)之間的兩次復(fù)制和1次系統(tǒng)調(diào)用。

自從python 3.3sendfile系統(tǒng)調(diào)用可用作os.sendfile,python 3.5 為基于socket的應(yīng)用帶來了更高級的封裝包socket.socket.sendfile。讓我們一起來創(chuàng)建一個客戶端—服務(wù)器文件傳輸?shù)睦?,稍后用sendfile改進(jìn)它。


image.png
image.png

客戶端不會故意溢出到磁盤上 - 我們想要對其進(jìn)行基準(zhǔn)測試,寫入操作將是最費時的。

引入socket.socket.sendfile后可將服務(wù)器代碼簡化為:

image.png

我已經(jīng)對這兩臺服務(wù)器運行了100次客戶端腳本。 執(zhí)行時間的分配如下所示。

image.png

在執(zhí)行時間方面,socket.socket.sendfile方法速度提高了一倍以上,并且穩(wěn)定得多。 時間的標(biāo)準(zhǔn)差分別為0.68s和0.03s。

轉(zhuǎn)自:
http://www.itdecent.cn/p/50b58f7a4844
`

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容