[問題] 請問list的效率以及讀檔問題

作者: googled (15357)   2014-12-19 19:01:36
各位高手好,
小弟目前有一隻非常要求執行效率的程式
本來是用JAVA在寫,且也已經盡量的去改善效能
但始終突破不了紀錄保持人的速度,
最近想說改用C++來寫寫看
可是光是第一步讀檔步驟,速度馬上就輸了java的bufferedReader
我想說把C++的讀檔也改成可以像JAVA那樣有緩衝區,減少從硬碟讀取檔案的次數
但每次檔案讀到尾端時,就會出現亂碼,我緩衝區的大小設1024
我在猜是不是因為最後檔案接近尾端時,檔案內容根本不足1024,所以才會出現亂碼?
想請各位高手指點我一下
ifstream fileInput;
fileInput.open ("1.txt", ios::binary );
char buff[1024];
string str;
while(fileInput){
fileInput.read(buff,1024);
str = buff;
cout<<str<<endl;
}
這是我用小檔案測試讀檔的內容:http://ppt.cc/EnhB
如果真得是因為檔案最後的內容不足1024。因此出現亂碼
那想請問該如何才能知道最後還剩多少內容還沒讀取?
以便讓我修改緩衝區的大小
或者說我這實做方法根本就是錯誤的,謝謝。
另外就是雖然C++的list跟JAVA的linkedList內部實作上也許不太一樣
但原理應該是大同小異(我猜的)
不曉得為什麼同樣都是push_back相同的數量
但c++的list卻比java慢很多@@
例如說我塞一千個string進去,C++要0.6秒,JAVA卻只要0.009秒
整個速度有著很大的差距@@
想請問說是有什麼關鍵的東西是我沒注意到的嗎?
感謝各位
作者: lNishan (紫小霓)   2014-12-19 19:12:00
用C的Standard library
作者: fireslayer (fireslayer)   2014-12-19 20:13:00
每一個iter都把buff清空成/0看看\0
作者: LiloHuang (十年一刻)   2014-12-19 20:13:00
檔尾的處理請直接參照此網頁範例 http://goo.gl/LW3GP0
作者: fireslayer (fireslayer)   2014-12-19 20:14:00
\0
作者: LiloHuang (十年一刻)   2014-12-19 20:14:00
該範例中的 is.gcount() 就會是最後一次成功讀取的數量塞進去 std::list 會比較慢,可能是有多餘的字串拷貝可考慮搭配 std::shared_ptr<std::string> 來嘗試改善另外,講求性能的檔案讀取請愛用 memory-mapped file可直接將檔案映射為一個記憶體位址,實在是快速又方便
作者: damody (天亮damody)   2014-12-19 20:32:00
你的list是arraylist還是LinkedList?? c++是要用vector吧你沒丟程式碼感覺不出你的問題在哪 請樓下隔空抓藥你編譯的是 release mode 還是 debug mode也有差是linklist沒錯 你的list改存string*會快很多
作者: iwami (吃)   2014-12-19 21:53:00
請問為什麼用ios::binary啊?C++字串的結尾都是用'\0'來標記但是binary沒有
作者: descent (「雄辯是銀,沉默是金」)   2014-12-19 21:58:00
用 getline 直接存到 string,c++比 java慢,實在不服氣
作者: PkmX (阿貓)   2014-12-19 22:19:00
先把完整程式貼上來再說吧 不是每個人都有買水晶球好嗎= =
作者: LPH66 (-6.2598534e+18f)   2014-12-19 22:30:00
>iwami 如果是用 std::string (像原 PO) 那就不需要 \0
作者: iwami (吃)   2014-12-20 02:34:00
抱歉,我指的是char[]char*這類東西
作者: lNishan (紫小霓)   2014-12-20 02:59:00
String是一個object,你push進去的時候會把內容全部複製一遍 (整個字串);String *只是指標(ie. 記憶體位置),只有64 bits(假設是64位元OS)但是如果用指標要小心scope,小心dangling pointer然後用char string + fgets 會快更多linked list 自己寫也會快一些或是換GCC,下O3(優化),應該又會更快;反正方法很多
作者: LiloHuang (十年一刻)   2014-12-20 10:11:00
若是 VS2013 可直接用 std::shared_ptr<std::string>raw pointer 也沒什麼不好,要小心 memory leak 就是
作者: googled (15357)   2014-12-22 18:19:00
我明白了,非常謝謝各位前輩的建議跟教學,感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com