社区讨论

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秒) io.h
CPP
#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 条回复,欢迎继续交流。

正在加载回复...