fstream與 C 風格(例如fread 和 fwrite )兩種讀寫檔案方法的效率比較

來源:互聯網
上載者:User

 

為了探錄c++ 風格的fstream與 C 風格(例如fread 和 fwrite )兩種讀寫檔案的方法的效率,我特意做了兩個實驗。

 

我的機器是Windows XP, Visual Studio 2008

 

1. 測試寫檔案速度

 

 

程式設計思路: 將TEST_SIZE個字元用兩種方式寫入檔案,記錄兩種方式的耗時。

 

 

實驗代碼:

 

void test_write()<br />{<br />const int TEST_SIZE = 10000000 ;<br />const char* c_plus_write_file = "H://c_plus_write_file.txt";<br />const char* c_write_file = "H://c_write_file.txt";</p><p>cout<<"Test size :" << TEST_SIZE <<endl;<br />//c++ style writing file<br />ofstream of(c_plus_write_file);<br />assert(of);<br />time_t start, end;<br />start = clock();<br />for(int i=0; i < TEST_SIZE; ++i)<br />{<br />char tmp[1];<br />tmp[0] = char(i);<br />of << tmp[0];<br />}<br />end = clock();<br />of.close();<br />cout<<"C++ style: "<<end - start <<" ms"<<endl;<br />//c style writing file<br />FILE* fp = fopen(c_write_file, "w");<br />start = clock();<br />for(int i=0; i < TEST_SIZE; ++i)<br />{<br />char tmp[1];<br />tmp[0] = char(i);<br />fwrite( tmp, 1, 1, fp);<br />}<br />end = clock();<br />fclose(fp);<br />cout<<"C style: "<<end - start <<" ms"<<endl;<br />cin.get();<br />}<br /> 

 

實驗結果:

圖1

圖2

圖3

 

**從圖1、2、3,可以看出, ofstream 的 << 運算子 所耗時 是fwrite()的近三倍

 

 

把of<<的代碼改成了: of.write(tmp,1);
後結果:

 

 

實驗代碼:

 

void test_write()<br />{<br />const int TEST_SIZE = 1000000 ;<br />const char* c_plus_write_file = "H://c_plus_write_file.txt";<br />const char* c_write_file = "H://c_write_file.txt";</p><p>cout<<"Test size :" << TEST_SIZE <<endl;<br />//c++ style writing file<br />ofstream of(c_plus_write_file);<br />assert(of);<br />time_t start, end;<br />start = clock();<br />for(int i=0; i < TEST_SIZE; ++i)<br />{<br />char tmp[1];<br />tmp[0] = char(i);<br />of.write(tmp,1);<br />}<br />end = clock();<br />of.close();<br />cout<<"C++ style: "<<end - start <<" ms"<<endl;<br />//c style writing file<br />FILE* fp = fopen(c_write_file, "w");<br />start = clock();<br />for(int i=0; i < TEST_SIZE; ++i)<br />{<br />char tmp[1];<br />tmp[0] = char(i);<br />fwrite( tmp, 1, 1, fp);<br />}<br />end = clock();<br />fclose(fp);<br />cout<<"C style: "<<end - start <<" ms"<<endl;<br />cin.get();<br />}<br /> 

實驗結果:

 

圖4

圖5

圖6

 

 

對比圖4 和 圖1、 圖5 和 圖2、圖6 和 圖3, 可以看到  << 運算子沒有 ofstream.write(), 快, 但兩者還是沒有 fwrite() 快

 

結論: 效率   fwrite() >  ofstream.operator<<() > ofstream.write() 

 

 

 

 

3. 下面做讀檔案的比較:

 

程式設計思路: 用兩種方法去讀一個近100M的文本,記錄時間。

 

實驗代碼:

void test_read()<br />{<br />const char* read_file = "H://read4.txt";<br />const int BUF_SIZE = 1024 ;<br />char buf[BUF_SIZE];<br />//c++ style writing file<br />ifstream ifs(read_file,ios::binary);<br />assert(ifs);<br />time_t start, end;<br />start = clock();<br />while(!ifs.eof())<br />{<br /> ifs.read(buf,BUF_SIZE);<br />}<br />end = clock();<br />ifs.close();<br />cout<<"C++ style: "<<end - start <<" ms"<<endl;<br />//c style writing file<br />FILE* fp = fopen(read_file, "rb");<br />start = clock();<br />int len = 0;<br />do<br />{<br />len = fread(buf,1,BUF_SIZE,fp);<br />//cout<<len<<endl;<br />}while(len != 0);<br />end = clock();<br />fclose(fp);<br />cout<<"C style: "<<end - start <<" ms"<<endl;<br />cin.get();<br />}<br /> 

 

實驗結果:

圖7

 

結論: 讀取一個 100M 的檔案, fread() 的效率 是 ifstream.read()的將近十倍! (此結論驚人!)

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.