论整数输出优化

15 篇文章 7 订阅
10 篇文章 0 订阅

背景

前些天,看到有些大牛写了输出优化,于是乎,我就想比较一下输出优化和printf、cout的速度,想证明输出优化是否有所用处。
于是,想起ctime头文件和clock函数可以测试程序在运行期间花费的时间,于是就有了灵感,写出了一个测试程序。

搜集资料

网上有两种输出优化程序,分别是:

要用数组的。

int buf[30];
void putint_array(int x)
{
    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]--]);
}

一般的。

void putint_usual(int p){
    if(p<0)putchar('-'),p=-p;
    if(p>9)printf("%d",p/10);
    putchar(p%10+'0');
}

有一天构思出了一种递归输出方法。

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

另外,C++还有printf和cout。

程序

write和putint函数是两种输出优化函数,然后以下是测试程序。

#include<windows.h>
#include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
int buf[30];
const int Test=1000000;
inline void putint_array(int x)//输出优化一,要用数组
{
    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 putint_usual(int p){//输出优化二,平常算法
    if(p<0)putchar('-'),p=-p;
    if(p>9)printf("%d",p/10);
    putchar(p%10+'0');
}
inline void putint_recursion(int p)//输出优化三,递归算法
{
    if(p<0)putchar('-'),p=-p;
    if(p>9)putint_recursion(p/10);
    putchar(p%10+'0');
}
int main()//测试
{
    freopen("Test.out","w",stdout);
    double A[5];
    //测试printf
    double t1=clock();
    for(int i=1;i<=Test;i++)
        printf("%d",i);
    double t2=clock();
    A[0]=(t2-t1)/1000;
    //测试cout
    t1=clock();
    for(int i=1;i<=Test;i++)
        cout<<i;
    t2=clock();
    A[1]=(t2-t1)/1000;
    //测试putint_usual
    t1=clock();
    for(int i=1;i<=Test;i++)
        putint_usual(i);
    t2=clock();
    A[2]=(t2-t1)/1000;
    //测试putint_array
    t1=clock();
    for(int i=1;i<=Test;i++)
        putint_array(i);
    t2=clock();
    A[3]=(t2-t1)/1000;
    //测试putint_recursion
    t1=clock();
    for(int i=1;i<=Test;i++)
        putint_recursion(i);
    t2=clock();
    A[4]=(t2-t1)/1000;
    //输出结果
    fclose(stdout);
    freopen("Answer.out","w",stdout);
    printf("When number is %d,\n",Test);
    printf("printf          took %.3lf second(s)\n",A[0]);
    printf("cout            took %.3lf second(s)\n",A[1]);
    printf("putint_usual        took %.3lf second(s)\n",A[2]);
    printf("putint_array        took %.3lf second(s)\n",A[3]);
    printf("putint_recursion    took %.3lf second(s)\n",A[4]);
}

注:

  1. clock()的作用为获取当前的时间,两时间差即函数花费的时间。
  2. system(“cls”)的作用为清屏,要用windows.h头文件,且只能在windows操作系统下使用。
  3. Test的值可以改变,意义为测试的数量。
  4. 为了公平起见,四个函数都inline,变成自带函数。
  5. 运用物理思想:多次实验获取普遍规律。

测试结果

When number is 10000000,
printf took 2.984 second(s)
cout took 2.203 second(s)
putint_usual took 2.875 second(s)
putint_array took 1.422 second(s)
putint_recursion took 2.172 second(s)

cena

让我大吃一惊的是cout竟然比printf还快,后面实验发现cout擅长的是小数据的输出,不能输出大数据。

结论

所以,以后我们还是用printf自带函数或者数组输出优化(如果你愿意)。如果要写,也可以装一下逼。以上就是我的个人观点,仅供参考。

以下文章可能对你有所参考:
http://blog.csdn.net/c20182030/article/details/69388906

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值