[问题] 请问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;
}
这是我用小档案测试读档的内容:

如果真得是因为档案最后的内容不足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