2012-05-26 85 views
-3

在編程問題中,我需要輸入1到10000範圍內的大量數字。問題建議使用快速I/O方法。我看着Fast input/output in competitive programming但它太複雜了。那麼任何人都可以告訴我一個簡單的方法來獲得快速的io。C++中的快速輸入/輸出

也請告訴我,如果使用gets,然後做atoi()比使用scanf(%d)以數字作爲輸入更快。

+2

'atoi'和'scanf'用於單獨的東西,並沒有真正的可比性。 –

+0

我很想知道什麼問題poser認爲快速IO和慢IO方法... – sarnold

+1

>也請告訴我,如果使用get然後做atoi()比使用scanf()更快。 我不會相信任何人告訴我什麼是更快的,衡量它的用例,然後做出自己的決定。 –

回答

3

要回答您的問題的第二部分,對我而言,看起來atoi約快兩倍。考慮以下幾點:

#define ITERS 1000000 

clock_t testAtoi() 
{ 
    char buffer[64]; 
    clock_t start = clock(); 

    for (int i = 0; i < ITERS; i++) { 
     sprintf(buffer, "%i", i); 
     int l = atoi(buffer); 
    } 

    return clock() - start; 
} 

clock_t testScanf() 
{ 
    char buffer[64]; 
    clock_t start = clock(); 

    for (int i = 0; i < ITERS; i++) { 
     sprintf(buffer, "%i", i); 
     int l = 0; 
     sscanf(buffer, "%i", &l); 
    } 

    return clock() - start; 
} 

int main() 
{ 
    printf("clocks for atoi: %lu\n", testAtoi()); 
    printf("clocks for sscanf: %lu\n", testScanf()); 

    return 0; 
} 

對於我來說,使用gcc和-O0(所以我的變量沒有被優化掉),該程序的輸出:

的時鐘的atoi:222011點
的時鐘的sscanf: 392409

但是,如果你使用的是FILE *,那麼也許fscanf會更快。我現在沒有時間比較兩者,但對於原始字符串,大部分我只會使用atoi

+1

'clock'可能不是衡量這一點的恰當函數,因爲它測量的是cpu利用率,而不是花費的時間。而且,爲什麼你使用'-Os'而不是'-O3'? –

+1

@JensGustedt雖然我意識到'clock'只顯示CPU ticks,一般來說,CPU ticks數量最多的函數會比較慢。它也爲我們提供了一種測量功能的原始速度的方法,儘管它有點出乎意料(例如,睡眠會混亂)。我使用'-Os'只是因爲它是Xcode所說的最快的,但我會用'-O3'重試並顯示結果。 –

-1

FASTIO在C/C++中沒有任何特殊的庫。

用C/C++打印輸出的最快方法是在stdio.h庫中使用fwrite或fwrite_unlocked。

此外,還沒有任何特殊/直接功能一次打印輸出。

間接地,可以使用append函數(將所有輸出字符串附加到單個字符串並打印最終字符串)實現在cplusplus中,甚至在string.h lib中使用strcat函數,但性能明智:「附加或concat +打印「比較慢,甚至比printf慢得多。

因此,在c/C++中最快的方法是:直接讀取原始表單中的流,並提取所需的信息。還將原始形式的輸出放入一個巨大的緩衝區中,並最終使用fwrite顯示它。

並請嘗試去通過這個鏈接快速IO解決方案(http://www.codechef.com/viewsolution/244848)

0

請參閱本博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html

最快在C/C++中進行輸入的方法是從輸入緩衝區中讀取每個字符,並將它們推送到結果變量中,直到達到分隔符。

但是,scanf的速度也很快,即使在競爭性編程的世界裏,我們也不得不使用getchar_unlocked。