為了探錄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()的將近十倍! (此結論驚人!)