在編程問題中,我需要輸入1到10000範圍內的大量數字。問題建議使用快速I/O方法。我看着Fast input/output in competitive programming但它太複雜了。那麼任何人都可以告訴我一個簡單的方法來獲得快速的io。C++中的快速輸入/輸出
也請告訴我,如果使用gets
,然後做atoi()
比使用scanf(%d)
以數字作爲輸入更快。
在編程問題中,我需要輸入1到10000範圍內的大量數字。問題建議使用快速I/O方法。我看着Fast input/output in competitive programming但它太複雜了。那麼任何人都可以告訴我一個簡單的方法來獲得快速的io。C++中的快速輸入/輸出
也請告訴我,如果使用gets
,然後做atoi()
比使用scanf(%d)
以數字作爲輸入更快。
要回答您的問題的第二部分,對我而言,看起來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
。
'clock'可能不是衡量這一點的恰當函數,因爲它測量的是cpu利用率,而不是花費的時間。而且,爲什麼你使用'-Os'而不是'-O3'? –
@JensGustedt雖然我意識到'clock'只顯示CPU ticks,一般來說,CPU ticks數量最多的函數會比較慢。它也爲我們提供了一種測量功能的原始速度的方法,儘管它有點出乎意料(例如,睡眠會混亂)。我使用'-Os'只是因爲它是Xcode所說的最快的,但我會用'-O3'重試並顯示結果。 –
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)
請參閱本博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html
最快在C/C++中進行輸入的方法是從輸入緩衝區中讀取每個字符,並將它們推送到結果變量中,直到達到分隔符。
但是,scanf的速度也很快,即使在競爭性編程的世界裏,我們也不得不使用getchar_unlocked。
'atoi'和'scanf'用於單獨的東西,並沒有真正的可比性。 –
我很想知道什麼問題poser認爲快速IO和慢IO方法... – sarnold
>也請告訴我,如果使用get然後做atoi()比使用scanf()更快。 我不會相信任何人告訴我什麼是更快的,衡量它的用例,然後做出自己的決定。 –