社区讨论
c++在最新环境下流式IO是不是比C风格更快?
学术版参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo2acoqo
- 此快照首次捕获于
- 2023/10/23 10:35 2 年前
- 此快照最后确认于
- 2023/11/03 10:47 2 年前
RT,测试环境:
- 电脑硬件:
Intel Core i7-1360P,32G内存,1T固态硬盘 - 编译器版本:
g++.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0 - 编译命令:
g++ -o %s %s -g -Dlocal -Wall -Wl,--stack=8388608 -std=c++11
测试过程及结果:
二进制读写下,均手工控制缓冲区,c风格的fwrite没有c++的fstream里的write快
c风格:(约2.7秒)
CPPio.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);
主程序:
CPP#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秒
CPP#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秒以上,且波动很大
CPP#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秒
CPP#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;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...