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
`