请STL高手帮忙:怎么加速fstream(ofstream, ifstream)的操作
边城狂人 2007-09-04 10:41:10 首先说明,输入输出都是二进制的方式,也就是用ofstream的write输出,用ifstream的read读入。
现在有一个测试用的结构
struct Test {
int v1;
int v2;
int v3;
int v4;
int v5;
int v6;
}
产生1000000个对象用于输出测试(保存在一个std::vector中)。
for (int i = 0; i < 1000000; i++) {
Test& t = v[i];
out.write((const char*) &v1, sizeof(int));
out.write((const char*) &v2, sizeof(int));
out.write((const char*) &v3, sizeof(int));
out.write((const char*) &v4, sizeof(int));
out.write((const char*) &v5, sizeof(int));
out.write((const char*) &v6, sizeof(int));
}
这样写1000000条数据的时间是26秒左右。
如果我自己定义一个缓冲类来写,时间会在7秒左右。自定义的缓冲类如下:
class MyOStream : public ofstream
{
public:
static const BUF_SIZE = 10240;
MyOStream(const char* filename, ios_base::openmode _Mode = ios_base::out)
: ofstream(filename, _Mode), current(0) {}
void write(const char* buffer, unsigned int size)
{
if (current + size > BUF_SIZE) {
this->flush();
}
memcpy(this->buffer, buffer, size);
current += size;
}
void flush()
{
ofstream::write(this->buffer, current);
current = 0;
}
private:
char buffer[BUF_SIZE];
int current;
};
_____________________________________________________
现在问题是——用什么办法,不使用自定义的输出流,只使用std的缓冲机制,把速度提升起来!!
我试过out.rdbuf()->setbuf(....),设置了一个100K的缓冲区,输出操作同样消耗26秒左右的时间,似乎缓冲区没起到作用,不知为何?
注,所有时间以自己机器上为准,机器不同时间肯定是不同的。