#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <iosfwd>
#include <streambuf>
#include <ios>
#include <ostream>
#include <fstream>
#include <time.h>
#include <vector>
using namespace std;
class Test
{
public:
int v1,v2,v3,v4,v5,v6;
public:
Test(int v)
{
v1 = v2 = v3 = v4 = v5 = v6 = v;
}
};
class MyOStream
{
public:
static const unsigned int BUF_SIZE = 102400;
MyOStream(const char* filename) :
out(filename, std::ios_base::binary), current(0)
{
}
void write(const char* buffer, unsigned int size)
{
if(current + size > BUF_SIZE) {
this->flush();
out.write(buffer, size);
return;
}
if(current+size > BUF_SIZE) {
this->flush();
}
memcpy(&this->buffer[current], buffer, size);
current += size;
}
void flush()
{
if (current == 0)
return;
out.write(buffer, current);
current = 0;
}
void close()
{
flush();
out.close();
}
private:
std::ofstream out;
char buffer[BUF_SIZE];
int current;
};
void write(std::ostream& out, const Test& test)
{
out.write((const char*) &test.v1, sizeof(int));
out.write((const char*) &test.v2, sizeof(int));
out.write((const char*) &test.v3, sizeof(int));
out.write((const char*) &test.v4, sizeof(int));
out.write((const char*) &test.v5, sizeof(int));
out.write((const char*) &test.v6, sizeof(int));
}
void write2(ostream& out, const Test& test) {
out.rdbuf()->sputn((const char*) &test.v1, sizeof(int));
out.rdbuf()->sputn((const char*) &test.v2, sizeof(int));
out.rdbuf()->sputn((const char*) &test.v3, sizeof(int));
out.rdbuf()->sputn((const char*) &test.v4, sizeof(int));
out.rdbuf()->sputn((const char*) &test.v5, sizeof(int));
out.rdbuf()->sputn((const char*) &test.v6, sizeof(int));
}
void write4(MyOStream& out, const Test& test) {
out.write((const char*) &test.v1, sizeof(int));
out.write((const char*) &test.v2, sizeof(int));
out.write((const char*) &test.v3, sizeof(int));
out.write((const char*) &test.v4, sizeof(int));
out.write((const char*) &test.v5, sizeof(int));
out.write((const char*) &test.v6, sizeof(int));
}
void outputTime(const char* message, const clock_t& clk1, const clock_t& clk2) {
cout << message << " (ms): "<< (clk2 - clk1)<< endl;
}
void outputTime(const char* message, const clock_t& clk1) {
clock_t clk2 = clock();
outputTime(message, clk1, clk2);
}
int _tmain(int argc, _TCHAR* argv[])
{
const int COUNT = 1000000;
clock_t clk = clock();
std::vector<Test> data;
for(int i = 0; i < COUNT; i++) {
data.push_back(Test(i));
}
outputTime("Create data vector", clk);
clk = clock();
ofstream out("D:\\test.bin", std::ios_base::binary);
for(int i = 0 ; i < COUNT; i++) {
const Test& test = data[i];
write(out, test);
}
out.close();
outputTime("Write all data without buffer", clk);
clk = clock();
ofstream out3("f:\\test3.bin", ios_base::binary);
char buffer[102400];
out3.rdbuf()->pubsetbuf(buffer, 102400);
for (int i = 0; i < COUNT; i++) {
const Test& test = data[i];
write2(out3, test);
}
out3.close();
outputTime("Write all data with big buffer", clk);
clk = clock();
MyOStream out4("f:\\test4.bin");
for (int i = 0; i < COUNT; i++) {
const Test& test = data[i];
write4(out4, test);
}
out4.close();
outputTime("Write all data with my buffer", clk);
}
fstream的缓冲及其效率比较
最新推荐文章于 2025-01-13 13:59:57 发布