2014-05-14 16 views
0

我已經看到它在幾個地方,一個fprintf中()操作是慢一點,一個FWRITE()操作中,由於在fprintf中額外的格式化操作說明。我想看看我是否可以真正測試這個,所以我有一些示例代碼在下面(我相信)就是這樣做的。 結果當然總是有點不同,但是大部分的時間他們是這樣的:速度fprintf中的()與fwrite()將

魅力。沒有。每個fwrite()的ticks超過1000000次寫入:0.2000

平均沒有。超過百萬寫入每fprintf中()的蜱:0.1300

即FWRITE()似乎是實際上稍微慢一點的是fprintf中()。 所以我在這裏的問題是雙重的:

A.看代碼(下面)我用來測試這個,這是一個合理的方法來測試 這樣的事情?任何人都可以推測其產生的結果無論如何可以精確地表示每個操作實際需要多長時間(以 爲單位)?

B.如果是這樣,爲什麼fwrite()需要更長的時間,我認爲fprintf()有 有效更多的工作與格式?

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <time.h> 

#define NO_OF_WRITES 1000000 

int main() 
{ 
    clock_t start1, end1, start2, end2; 
    FILE *fp; 
    int i; 
    float avg; 
    float diffs = 0; 
    uint8_t byte = 0x30; 

    if ((fp = fopen("file.bin", "w")) == NULL) 
    { 
      printf("Error opening file for writing"); 
      exit(-1); 
    } 
    for (i = 0; i < NO_OF_WRITES; i++) 
    { 
      start1 = clock(); 
      fwrite(&byte, 1, 1, fp); 
      end1 = clock(); 

      diffs += (end1 - start1); 
    } 

    avg = diffs/NO_OF_WRITES; 
    printf("Avg. no. of ticks per fwrite() over %d writes: %.4f\n", NO_OF_WRITES, avg); 

    diffs = 0; 

    for (i = 0; i < NO_OF_WRITES; i++) 
    { 
      start2 = clock(); 
      fprintf(fp, "%c", byte); 
      end2 = clock(); 

      diffs += (end2 - start2); 
    } 

    avg = diffs/NO_OF_WRITES; 
    printf("Avg. no. of ticks per fprintf() over %d writes: %.4f\n", NO_OF_WRITES, avg); 
    fclose(fp); 
} 
+7

我想我會把時鐘時間捕獲for循環之外,但那只是我! – trumpetlicks

+0

這是測試這種事情的好方法,但不同數據量和不同大小文件的時間是不同的。當虛空完成時,虛空即會對流進行沖洗。兩者都高度依賴於硬件和操作系統,因此您需要進行多次完整的運行才能獲得實際的數字。 – IdeaHat

+1

我同意trumpetlicks,你應該計時整個循環不是每次迭代。另外,你應該確保每個測試的條件都一樣。刪除文件,打開它,寫入並關閉每個測試。 –

回答

0

http://bobobobo.wordpress.com/2008/02/07/speed-tests-fprintf-vs-ofstream-and-fprintf-vs-fwrite/

我覺得既然你正在測試一個字符的寫操作,這將解決您的問題

+0

我對這個鏈接的測試有一個主要觀點。他在每個fwrite/fprintf/out之後都要做一個fflush(或者等價的)。這意味着這些調用的時間測量由於刷新緩衝區的I/O開銷而變得不明顯。結論可能是正確的(fwrite比fprintf快於out),差異的程度是錯誤的! – DoxyLover

1

,很可能其他開銷支配。特別是,fwrite需要兩個參數,它們相乘以確定要寫入的總大小,並且很可能該單倍乘指令佔據了所需時間fwrite ...