論整數輸出優化

背景

前些天,看到有些大牛寫了輸出優化,於是乎,我就想比較一下輸出優化和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

發佈了80 篇原創文章 · 獲贊 134 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章