標準C IO函式和 核心IO函式 效率(時間)比較

2022-04-12 17:38:17 字數 1278 閱讀 6400

前言

標準c提供的檔案相關的io函式,除標準錯誤輸出是不帶緩衝的(可以盡快的將錯誤訊息顯示出來)之外,所有與終端相關的都是行緩衝,其餘都是全緩衝的。

我們可以使用setbuf,setvbuf改變指定流的緩衝型別。

原型:

void setbuf(file *stream, char *buf);

int setvbuf(file *stream, char *buf, int

mode, size_t size); //成功返回0,失敗非0

函式的用法一目了然,當引數buf指定為null時,作業系統將自動為給定流分配適當的緩衝區。長度為bufsiz(沒有e,在stdio.h中定義)。

緩衝的作用可以減少系統呼叫的次數,系統呼叫是需要開銷的,從使用者態到核心態切換需要作業系統的排程。合適長度的緩衝區大小對於提公升io的效率來說比較重要。

核心函式和標準c函式的比較

處理的檔案大小: 270m的文字

檔案複製執行時間的比較

function

sysuser

real

備註fgetc,fputc

0m0.848s

0m6.232s

0m7.614s

fgets,fputs最快速度

0m1.204s

0m0.800s

0m3.709s

read,write最快速度

0m3.380s

0m0.752s

0m0.008s

buf[1024*8]

read,write 緩衝區==1

18m49.875s

0m35.166s

19m33.293s

比較結論:

1、標準io庫函式和核心函式相比並不相差多少,不是特別需要的情況下標準io未嘗不是乙個好的選擇。

2、fgets(fputs)比fgetc(fputc)快2倍之多,可見fgets(fputs)並不是用fgetc(fputc)實現的,否則他們的效率應該相似,據uc高階程式設計那本書上介紹,fgets,fputs是用memccpy實現的,而memccpy是用彙編寫的,自然比c函式效率高了。

附memccpy原型

void *memcpy(void *dest, const

void *src, size_t n);

//從src複製不超過n個位元組到dest,遇到n字元值為止

void *memccpy(void *dest, const

void *src, int c, size_t n);

標準 C I O函式

clearerr 清除錯誤 fclose 關閉乙個檔案 feof 如果到達檔案尾 end of file 返回 true 真 ferror 檢查乙個檔案錯誤 fflush 書寫輸出快取的內容 fgetc 從流獲取乙個字元 fgetpos 獲取檔案位置指標 fgets 從乙個流獲取一串字元 fopen...

核心IO和標準IO

對於檔案的讀寫操作函式在執行的空間來分,可以分為核心io 主要在核心中執行 和標準io 主要在使用者空間中執行 核心io需要自己建立和管理快取,而標準io是自動分類快取,一般來說,核心io的效率高於標準io,但是差距不是很大,考慮移植性,還是建議使用標準io 只要是支援標準c語言就支援標準io 無論...

19 高階I O函式 套接字和標準I O

之前我們一直使用的read,write函式以及它們的變體recv,send等函式執行i o,這些函式都是要使用描述符的,通常這些函式都作為unix核心中的系統呼叫實現。除了以上說的系統呼叫,我們也可以使用標準i o函式庫 standard i o libary 這個函式庫由 ansi c 標準進行規...