楼主:
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
作者: LiloHuang (十年一刻) 2014-12-19 20:13:00
作者: 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:00String是一个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我明白了,非常谢谢各位前辈的建议跟教学,感谢