2012-08-17 55 views
1

我正在處理一個小程序,處理相當大(4-5 MB),矩陣形(數字值存儲爲N * M行和列)ASCII文件:一種有效的方法來讀取ASCII文件

1 2 3 
4 5 6 
7 8 9 
etc. 

我注意到,老式的C文件輸入法:

csFile = fopen("file.dat","r"); 
while(fscanf(csFile, "%lf", &Point)!=EOF) { 
} 
fclose(csFile); 

比最基本的C++實現快得多(230毫秒相比〜1500毫秒存儲大約3MB文件230k數值):

ifstream myfile ("file.dat"); 
while(myfile >> Point) { 
} 
myfile.close(); 

爲了簡單起見,我省略了循環內部的數據操作函數,但即使這些「裸露」的例子也顯示了C型I/O的幾乎七倍增強。爲什麼會有如此巨大的性能差異?使用C++流/函數讀取這些文件有更快的方法嗎?

+0

http://stackoverflow.com/questions/605839/c-and-c-file-io – 2012-08-17 15:11:24

+0

http://stackoverflow.com/questions/1924530/mixing-cout-and-printf爲更快的輸出 http://stackoverflow.com/questions/1736267/c-cout-printing-slowly – BoBTFish 2012-08-17 15:12:46

+0

是230ms足夠快爲您?如果是這樣,是否有你不想使用'fscanf'的理由? – 2012-08-17 16:15:41

回答

3

如果你看到C和C++代碼之間有如此巨大的差異,我懷疑你沒有編譯優化。嘗試使用-O3或編譯器需要的任何標誌來啓用優化。測量未優化代碼的速度通常是毫無意義的,因爲它告訴你更多關於語言的複雜性的內容,而不是代碼的複雜性。特別是C++非常依賴於優化來獲得合理的性能。

-1

這可能涉及到緩衝區,嘗試通過功能可爲您的ifstream的足夠的緩衝區:

file.rdbuf()->pubsetbuf()

這將減少磁盤IO和系統調用。 (在批處理模式下閱讀)

+0

投票是爲了什麼原因? – 2012-08-17 22:38:56

相關問題