三種輸出方式的效率對比

序:
在上文中對比了四種讀入方式的效率,此次將對比三種輸出方式的效率。
三種方式分別是:printf(),cout,輸出優化(字符輸出)。
測試時間依然適用time.h的庫函數。ios


輸出代碼:ruby

inline void print(int curr)//輸出優化,遞歸到最高位,依次輸出
{
    if(curr > 9)    print(curr/10);
    putchar(curr%10+'0');
    return ;
}

void print1()
{
    freopen("test1.out", "w", stdout);
    int i;
    int startTime = clock();
    for(unsigned i = 0; i != n; ++i)
    {
        printf("%d ", m[i]);
    }
    int endTime = clock();
    ans[1] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
    fclose(stdout);
    return ;
}

void print2()
{
    freopen("test2.out", "w", stdout);
    int i;
    int startTime = clock();
    for(unsigned i = 0; i != n; ++i)
    {
        cout << m[i] << " ";
    }
    int endTime = clock();
    ans[2] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
    fclose(stdout);
    return ;
}

void print3()
{
    freopen("test3.out", "w", stdout);
    ios::sync_with_stdio(false);
    int i;
    int startTime = clock();
    for(unsigned i = 0; i != n; ++i)
    {
        print(m[i]);
        putchar('\0');
    }
    int endTime = clock();
    ans[3] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
    fclose(stdout);
    return ;
}

(如下數據爲總時間與平均時間,單位(s))
輸出10000*50(次)int型整數。(50萬)
結果以下:
0.157000 0.003140
0.122000 0.002440
0.048000 0.000960
速度的差距是30倍左右。markdown

輸出100000*50(次)int型整數:(500萬)
1.384000 0.027680
1.200000 0.024000
0.433000 0.008660函數

很奇怪的是printf()竟然尚未cout快。
並且putchar也慢了不少(難道是遞歸次數太多的緣由?)測試


再使用一個優化:將全部空格按轉義字符(‘\0’)輸出:
通過屢次測試,速度相比於直接輸出」 「要快10%左右。
1.181000 0.023620
1.048000 0.020960
0.410000 0.008200優化


因爲出現printf()和cout混用,關閉同步。ui

ios::sync_with_stdio(false);

可是發現cout的時間並無所以減小。spa

將關閉同步的代碼改爲這樣:code

ios_base::sync_with_stdio(false);

通過屢次測試,咱們驚奇地發現cout的時間竟然穩定在了0.9s:
0.898000 0.017960
看來關閉同步對於cout是個更好的選擇。遞歸


總而言之,對大量數據的輸出輸出優化絕對是當仁不讓的選擇(快1倍多),小數據快的更多(幾十倍),可是差距並不大。
如何選擇,具體狀況具體分析。

箜瑟_qi 2017.04.15 17:09

相關文章
相關標籤/搜索