c c 效能優化 I O優化(上)

2021-06-16 11:22:09 字數 2100 閱讀 4984

這節本想直接介紹i/o優化的,後來思考一下有必要對常用的i/o操作函式的特點介紹一下,這樣要好些。下面就先介紹和i/o有關的庫函式(以c99為準)

不同的作業系統有不同的檔案管理方式,現行的主要有fat(fileallocation table)、fat32、ntfs(new technoly file system)、nwfs(netware file system)以及ufs(unix file system)當然還有一些分布式檔案管理系統如:afs(andrew filesystem)、dfs、micorsoft dfs和nfs(net file system),這些檔案系統的安全機制和屬性都有著區別,所以當你做i/o優化時,要關注一下你所用的檔案系統型別。

第一:對於一些格式化輸入輸出函式要注意檢查format的型別是否匹配如fprintf(),printf(), sprintf(), snprintf(), vfprintf(), vprintf(), vsprintf()和vsnprintf()等。

第二:remove(),rename(),fopen(),freopen()這幾個函式使用時要注意兩點:a,要指定檔名和操作屬性;b,這些操作可以改變檔案屬性,有的改動是不可逆的,一定要小心。如fopen的時候,remove就不能使用。多路併發的時候尤其要注意。關於多執行緒/多程序的風險控制,後面會有詳細介紹,這裡提到一下。

第三:檔案路徑推薦標準化處理,另外根據要求,選擇相對路徑和絕對路徑。有很多公司都有封裝好的canonicalize path name module,如果你是新人,問一下老員工。千萬別等到軟體發布時,才發現路徑有問題。

第五:檔案操作函式,如果有返回值的一定要檢查返回值,確定檔案操作結果是你想要的。

使用error_no解析檔案操作結果時,多執行緒時要注意控制粒度。具體解決方案,可以參考任何一本多執行緒書籍。或多或少都有提及怎麼安全使用error_no。

第六:用fseek()替換rewind(),原因很簡單rewind沒有返回值,無法做安全性檢查。fseek(stream, 0l, seek_set)在功能上和rewind一樣。

第七:remove,rename操作的時候,確定檔案的狀態是否是open。

第八:當**對資料完整性有要求時,請用fflush()重新整理緩衝區。

第九:用setvbuf代替setbuf ,同樣理由是前者可以做安全性檢查setbuf(stream, buf)==setvbuf(stream, buf, _iofbf, bufsiz) or setvbuf(stream, buf, _ionbf, bufsiz)

第十:了解text mode和binary mode的區別。這兩種模式下使用fseek和ungetc的方式是不同的。希望讀者自己總結

第十一:習慣用foef和ferror來檢查檔案結尾和檔案操作錯誤

第十二:getc()和putc()是巨集,所以有邊際效應。如char*file_name;

file*fptr;

/*initialize file_name */

intc = getc(fptr = fopen(file_name,"r"));

if(c == eof)

//檔案被開啟了兩次。。所以會出錯。應該這樣寫:

intc;

char*file_name;

file*fptr;

/*initialize file_name */

fptr= fopen(file_name, "r");

if(fptr == null)

c= getc(fptr);

if(c == eof)

第十三:最後再強調一下,檔案開啟要關閉,返回型別要做安全檢查。

IO效能的優化

一 載入前 1.預讀取,避免後面一下子讀取任務太多 使用預先讀取,分步讀取,避免記憶體峰值突然上公升。預載入 cctexturecache ccspriteframecache ccanimationcache 都可以為其新增乙個 key,後面通過 key索引獲取紋理 精靈或動畫。二 載入時 2.非...

socket效能優化 上

socket效能優化 上 2012年01月01日 b socket效能優化 b m.tim jones 資深軟體工程師,emulex 使用 sockets api,我們可以開發客戶機和伺服器應用程式,它們可以在本地網路上進行通訊,也可以通過 internet 在全球範圍內進行通訊。與其他 api 一...

socket效能優化 上

socket效能優化 上 2012年01月01日 b socket效能優化 b m.tim jones 資深軟體工程師,emulex 使用 sockets api,我們可以開發客戶機和伺服器應用程式,它們可以在本地網路上進行通訊,也可以通過 internet 在全球範圍內進行通訊。與其他 api 一...