通過幾個c**來檢測一下檔案系統相關系統呼叫時間,以及和標準i/o庫函式的效能差異。主要以read和fread函式為例。
我們來模擬一下read系統呼叫的開銷情況,
**如下:
#include
#include
#include
#include
int main()
建立輸入檔案file.in如下:
dd if=/dev/zero of=file.in bs=1 count=1024000
執行測試如下:
# time ./a.out
real 0m1.080s
user 0m0.064s
sys 0m1.012s
發現主要時間是花在了sys上的,即核心態,當然我們知道是系統呼叫了,因為就是我們寫的嘛。
可以使用strace來跟蹤程式,就會不斷顯示系統呼叫write和read了。
通過測試時間,其實我們計算得到一次write+read的時間的。就是1.012s/1024000=0.98us。
修改程式如下:
#include
#include
#include
#include
int main()
程式中,去掉了write只留下了read系統呼叫,執行後時間如下:
# time ./a.out
real 0m0.222s
user 0m0.012s
sys 0m0.208s
可以計算得到每次read的大概時間為0.208/1024000=0.2us.在不同的機器上執行會有不同的結果,大家可以自行測試,祝玩的愉快。
後續會將該程式進行優化。
將**進行優化如下:
#include
#include
#include
#include
intmain ()
一次read的位元組數量修改為1024個位元組。
執行後如下,
# time ./a.out
real 0m0.002s
user 0m0.000s
sys 0m0.000s
發現執行時間大幅降低了,效能得到了優化,理論上應該快了千倍被,畢竟系統呼叫次數減少了千次。
標準i/o庫是由stdio及標頭檔案stdio.h為底層i/o系統呼叫提供的乙個通用介面,例如fopen,fread,fclose等。現在是ansi標準c的一部分。
使用標準i/o庫的函式來進行測試,**如下,
#include
#include
intmain ()
編譯執行,
# time ./a.out
real 0m0.036s
user 0m0.032s
sys 0m0.000s
發現sys時間幾乎為0,說明主要是在使用者態的操作,相比read系統呼叫所化時間(如下)快了很多。
real 0m1.080s
user 0m0.064s
sys 0m1.012s
這個主要是因為在
stdio
庫在file
結構裡使用了乙個內部緩衝區。只有在緩衝區滿時候才進行底層系統呼叫再刷資料,當然比直接系統呼叫快很多了。
linux檔案系統系統呼叫 fallocate
int fallocate int fd,int mode,off t offset,off t len 為檔案預分配物理空間。include 成功返回0,失敗返回 1。fd檔案描述符 mode 目前兩種mode 1.falloc fl keep size 從offset開始分配大小為len的空間,...
Linux 檔案系統呼叫(習題)
1 設計乙個程式,要求開啟檔案 pass 如何沒有這個檔案,新建此檔案,許可權設定為只有所有者有唯讀許可權。程式 include include include int main 2 設計乙個程式,要求新建乙個檔案 hello 利用write函式將 linux下c軟體設計 字串寫入該檔案 程式 in...
linux系統呼叫之檔案系統操作
access 確定檔案的可訪問性 chdir 改變當前工作目錄 fchdir 參見chdir chmod 改變檔案方式 fchmod 參見chmod chown 改變檔案的屬主或使用者組 fchown 參見chown lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 ...