【原创】各类输出与输出优化的比较

一、背景

做题的时候,经常写读入优化,而读入优化的核心是“getchar”,它比scanf快多了。

我不禁想,有没有“putchar”呢?有。那么有没有输出优化呢?它和printf和cout谁更快呢?

于是就写下了这个验证程序。


二、验证


在网上搜了一下,主要有两种输出优化。

第一种是比较常见的:

inline void Putint_usual(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) Putint_usual(x/10);
    putchar(x%10+'0');
}

第二种是使用数组的的:

inline void Putint_array(int x)
{
	int buf[30]={0};
	if (x<0) putchar('-'),x=-x;
	buf[0]=0;
	while (x) buf[++buf[0]]=x%10,x/=10;
	if (!buf[0]) buf[0]=1,buf[1]=0;
	while (buf[0]) putchar('0'+buf[buf[0]--]);
}

以上两种的基本思路就是把这个数的每一位都求出来,然后依次用putchar输出。


除此之外,c语言还自带有printf,c++还有cout。


于是我写了一个程序。


#include
#include
#include
#include
#include
using namespace std;
inline void pri(int p)
{
	printf("%d",p);
}
inline void Putint_usual(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) Putint_usual(x/10);
    putchar(x%10+'0');
}
inline void Putint_array(int x)
{
	int buf[30]={0};
	if (x<0) putchar('-'),x=-x;
	buf[0]=0;
	while (x) buf[++buf[0]]=x%10,x/=10;
	if (!buf[0]) buf[0]=1,buf[1]=0;
	while (buf[0]) putchar('0'+buf[buf[0]--]);
}
inline void c(int p)
{
	cout<



代码解释:

clock();//取得当前的时间,单位是ms。要算一段时间,只需要用 [(结束的时间)-(开始的时间)],即可,因为单位是ms,所以除以1000,让单位转化成s。需要#include或者#include

system("cls");//清屏指令,需要#include头文件


补充说明:

1.为了公平起见,四种方式都写在了内链函数里。避免调用函数的时间对程序产生影响。

2.四种方式都非常的不稳定,只运行一次不可信。

3.T是可以更改的

4.因为是比较输出效率,所以说必须输出出来,但是满屏都是数字在飞,特别烦人,所以加了清屏指令。


下面T=30000和T=10000000为例,输出结果为:


When T=300000: 
Putint_array took 0.05 second
Putint_usual took 0.03 second
printf took 0.11 second
cout took 0.08 second


When T=10000000: 
Putint_array took 1.97 second
Putint_usual took 1.51 second
printf took 3.77 second
cout took 2.80 second


所以说,相较起来,常规的输出优化是最快的,而cout擅长输出小数据,比如把输入i换成输出一个很大的数字来看看?


#include
#include
#include
#include
#include
using namespace std;
inline void pri(int p)
{
	printf("%d",p);
}
inline void Putint_usual(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) Putint_usual(x/10);
    putchar(x%10+'0');
}
inline void Putint_array(int x)
{
	int buf[30]={0};
	if (x<0) putchar('-'),x=-x;
	buf[0]=0;
	while (x) buf[++buf[0]]=x%10,x/=10;
	if (!buf[0]) buf[0]=1,buf[1]=0;
	while (buf[0]) putchar('0'+buf[buf[0]--]);
}
inline void c(int p)
{
	cout<

结果:

When T=5000000: 
Putint_array took 1.11 second
Putint_usual took 0.16 second
printf took 0.88 second
cout took 1.11 second


综上:还是使用输出优化吧!



注意:


以上结果是输出在了Freopen里,但是如果不要Freopen,直接在cmd里输出,会得到完全不一样的结果!(输出在cmd时,printf较快!)


你可能感兴趣的:(#,心得)