w***g 发帖数: 5958 | 1 怎么搞就只能搞到30MB/s的速度。7200RPM的硬盘,裸写应该可以达到100MB/s。用stra
ce发现底层是用writev实现的,每次只写8KB多一点。即使用了rdbuf()->pubsetbuf也不
行。改成FILE和fwrite后,默认也是每次写8KB多一点(BUFSIZ=8KB),但是setvbuf后就
可以buffer任意大了。这次本牛也搞不定了,希望版上的大牛们给支援一下。 |
b***i 发帖数: 3043 | 2 因素很多,比如磁盘的扇区大小,还有你是不是读了又写,磁盘测试软件结果怎么样?
可以预先设定文件大小,文件是不是在硬盘上连续,cpu如果不写磁盘光准备数据有 多
块?
文件到底多大?在windows还是linux?
stra
也不
【在 w***g 的大作中提到】 : 怎么搞就只能搞到30MB/s的速度。7200RPM的硬盘,裸写应该可以达到100MB/s。用stra : ce发现底层是用writev实现的,每次只写8KB多一点。即使用了rdbuf()->pubsetbuf也不 : 行。改成FILE和fwrite后,默认也是每次写8KB多一点(BUFSIZ=8KB),但是setvbuf后就 : 可以buffer任意大了。这次本牛也搞不定了,希望版上的大牛们给支援一下。
|
n******t 发帖数: 4406 | 3 C++ 的stream 本来效率就低下。。。一般用用就行了。
stra
也不
【在 w***g 的大作中提到】 : 怎么搞就只能搞到30MB/s的速度。7200RPM的硬盘,裸写应该可以达到100MB/s。用stra : ce发现底层是用writev实现的,每次只写8KB多一点。即使用了rdbuf()->pubsetbuf也不 : 行。改成FILE和fwrite后,默认也是每次写8KB多一点(BUFSIZ=8KB),但是setvbuf后就 : 可以buffer任意大了。这次本牛也搞不定了,希望版上的大牛们给支援一下。
|
s*****V 发帖数: 21731 | 4 专业的写用什么?
【在 n******t 的大作中提到】 : C++ 的stream 本来效率就低下。。。一般用用就行了。 : : stra : 也不
|
t****t 发帖数: 6806 | 5 basic_filebuf::setbuf()除了在buffer是null的情况下确定无buffer, 别的都是
implementation-defined.
我看了下源码, basic_filebuf内部用的是basic_file<>, which is a wrapper for
FILE*. 那个内部另有buffer, 如果只靠标准函数似乎拿不到. 我看看能不能用非标准
的东西来拿.
stra
也不
【在 w***g 的大作中提到】 : 怎么搞就只能搞到30MB/s的速度。7200RPM的硬盘,裸写应该可以达到100MB/s。用stra : ce发现底层是用writev实现的,每次只写8KB多一点。即使用了rdbuf()->pubsetbuf也不 : 行。改成FILE和fwrite后,默认也是每次写8KB多一点(BUFSIZ=8KB),但是setvbuf后就 : 可以buffer任意大了。这次本牛也搞不定了,希望版上的大牛们给支援一下。
|
t****t 发帖数: 6806 | 6 OK, after some googling, I think you can use:
#include
__gnu_cxx::stdio_filebuf
to replace std::basic_filebuf<>. This can be constructed from a FILE*, and
you can then do whatever to that FILE* (setvbuf, for example).
stra
也不
【在 w***g 的大作中提到】 : 怎么搞就只能搞到30MB/s的速度。7200RPM的硬盘,裸写应该可以达到100MB/s。用stra : ce发现底层是用writev实现的,每次只写8KB多一点。即使用了rdbuf()->pubsetbuf也不 : 行。改成FILE和fwrite后,默认也是每次写8KB多一点(BUFSIZ=8KB),但是setvbuf后就 : 可以buffer任意大了。这次本牛也搞不定了,希望版上的大牛们给支援一下。
|
w***g 发帖数: 5958 | 7 好吧。既然你们这几个老水车都只能想出来这个办法,我还是直接FILE*算了。也不是非
要为了C++而C++。看来C++的iostream确实效率低下。
【在 t****t 的大作中提到】 : OK, after some googling, I think you can use: : #include : __gnu_cxx::stdio_filebuf : to replace std::basic_filebuf<>. This can be constructed from a FILE*, and : you can then do whatever to that FILE* (setvbuf, for example). : : stra : 也不
|
t****t 发帖数: 6806 | 8 这个确实不是为效率设计的, 不过它其实也没有太多大问题. 的思想是, 把字
节流的转换(stream层)和I/O(streambuf)分开了, 这个本身是很不错的思想.
是非
【在 w***g 的大作中提到】 : 好吧。既然你们这几个老水车都只能想出来这个办法,我还是直接FILE*算了。也不是非 : 要为了C++而C++。看来C++的iostream确实效率低下。
|