RT,测试环境:
Intel Core i7-1360P,32G内存,1T固态硬盘g++.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0g++ -o %s %s -g -Dlocal -Wall -Wl,--stack=8388608 -std=c++11测试过程及结果:
二进制读写下,均手工控制缓冲区,c风格的fwrite没有c++的fstream里的write快
c风格:(约2.7秒)
io.h:
#pragma once
#include<cstdio>
struct char_reader
{
FILE* f; char *buf,*p1,*p2; int size;
char_reader(FILE* fin,int bufsize=1000000) { f=fin; size=bufsize; p1=p2=0; buf=new char[bufsize]; }
inline int operator()() { return p1==p2&&(p2=(p1=buf)+fread(buf,1,size,f),p1==p2)?EOF:*p1++; }
};
struct char_writer
{
FILE* f; char *buf,*p,*end;
char_writer(FILE* fout,int bufsize=1000000) { f=fout; buf=new char[bufsize]; p=buf; end=buf+bufsize; }
~char_writer() { fwrite(buf,p-buf,1,f); }
inline char operator()(char ch) { return end==p&&(fwrite(buf,end-buf,1,f),p=buf),*p++=ch; }
};
char_reader gch(stdin);
char_writer wch(stdout);
主程序:
#include"io.h"
using namespace std;
int main()
{
freopen("cs.out","wb",stdout);
for(int i=0;i<1000000000;i++) wch(i%256);
return 0;
}
c++风格:约1.7秒
#include<fstream>
using namespace std;
char buf[1000000];
int main()
{
ofstream fs("cpps.out",ofstream::binary);
const char *end=buf+1000000;
char *p=buf;
for(int i=0;i<1000000000;i++)
{
if(end==p) { fs.write(buf,1000000); p=buf; }
*p++=i%256;
}
fs.close();
return 0;
}
文本模式读写时,c++风格的fstream也比fprintf快。(没有乱用endl之类的会刷新缓冲区的东西。) c风格:20秒以上,且波动很大
#include<cstdio>
using namespace std;
int main()
{
FILE *fp=fopen("cs.out","w");
for(int i=0;i<100000000;i++) fprintf(fp,"%d\n",i);
fclose(fp);
return 0;
}
c++风格:约6秒
#include<fstream>
using namespace std;
int main()
{
ofstream fs("cpps.out",ofstream::out);
for(int i=0;i<100000000;i++) fs<<i<<'\n';
fs.close();
return 0;
}