不知道大家有沒有這種習慣,在使用標準IO庫寫檔案時還喜歡另外開闢一個大的緩衝區來緩衝要寫的資料,待這個大的緩衝區滿了以後再調用fwrite/fread來進行IO操作,以為這樣可以減少IO次數。但實際情況卻不是這樣的,因為標準IO中已經有一個緩衝了,緩衝的大小設定為作業系統一次寫硬碟的字元數。上述做法,相當於在使用者態環境下多做了一次無無謂的記憶體拷貝操作。
我在linux環境下寫了一個例子來驗證我的想法
例子:/*****************************************************************<br />* Copyright (c) 2010, All rights reserved.<br />* 檔案摘要:該代碼檔案用來驗證使用標準IO/多塊標準IO/直接系統調用<br />* 為了簡潔起見代碼中沒有做錯誤處理<br />*****************************************************************/<br />#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <sys/time.h><br />using namespace std;</p><p>#define LOOP_TIME 9999999<br />#define OUTPUT_FILE "/data/cjdev/jiangf/io.output"<br />char strBuffer[1024];</p><p>/*單純使用標準io庫*/<br />void stdioLib()<br />{<br />struct timeval tpBegin;<br />struct timeval tpEnd;<br />memset(&tpBegin,0,sizeof(tpBegin));<br />memset(&tpEnd,0,sizeof(tpEnd));</p><p>gettimeofday(&tpBegin,NULL);<br />FILE *fp=fopen("/data/cjdev/jiangf/io.output1","w");<br />for(int i=0;i<LOOP_TIME;i++)<br />{<br />fwrite(strBuffer,sizeof(char),sizeof(strBuffer),fp);<br />}<br />fclose(fp);<br />gettimeofday(&tpEnd,NULL);<br />fprintf(stderr,"單純使用標準io庫:耗時%d秒,%d微秒/n",tpEnd.tv_sec-tpBegin.tv_sec,<br />tpEnd.tv_usec-tpBegin.tv_usec);<br />}</p><p>/*多塊寫入+使用標準io庫*/<br />void MultiStdio()<br />{<br />#define MAX_OUT_SIZE 8192<br />struct timeval tpBegin;<br />struct timeval tpEnd;<br />size_t nOffset=0;<br />char strOutPut[MAX_OUT_SIZE];</p><p>memset(strOutPut,0,sizeof(strOutPut));<br />memset(&tpBegin,0,sizeof(tpBegin));<br />memset(&tpEnd,0,sizeof(tpEnd));</p><p>gettimeofday(&tpBegin,NULL);<br />FILE *fp=fopen("/data/cjdev/jiangf/io.output2","w");<br />for(int i=0;i<LOOP_TIME;i++)<br />{<br />if( (nOffset+sizeof(strBuffer))>=MAX_OUT_SIZE )<br />{<br />fwrite(strOutPut,sizeof(char),sizeof(strOutPut),fp);<br />memset(strOutPut,0,sizeof(strOutPut));<br />nOffset=0;<br />}<br />else<br />{<br />strcpy(strOutPut+nOffset,strBuffer);<br />nOffset += sizeof(strBuffer);<br />}<br />}<br />fclose(fp);<br />gettimeofday(&tpEnd,NULL);<br />fprintf(stderr,"多塊寫入+使用標準io庫:耗時%d秒,%d微秒/n",tpEnd.tv_sec-tpBegin.tv_sec,<br />tpEnd.tv_usec-tpBegin.tv_usec);<br />}</p><p>int main()<br />{<br /> //從一個檔案中讀取資料來作為要寫的內容<br />memset(strBuffer,0,sizeof(strBuffer));<br />FILE *fpLog=fopen("2010080917.log","r");<br />fread(strBuffer,1,sizeof(strBuffer),fpLog);<br />fclose(fpLog);</p><p>stdioLib();<br />MultiStdio();<br />return EXIT_SUCCESS;<br />}<br />
以上是我的個人看法,不知道是否正確,歡迎大家參與討論
qq:41031962
mail:jiangfg1@gmail.com