これは、単純なケースの簡単なテストです。標準入力から数値のリストを読み取り、すべての数値のXORを行うプログラムです。
iostreamバージョン:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
scanfバージョン:
#include <stdio.h>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (1 == scanf("%d", &x))
parity ^= x;
printf("%d\n", parity);
return 0;
}
結果
3番目のプログラムを使用して、33,280,276個の乱数を含むテキストファイルを生成しました。実行時間は次のとおりです。
iostream version: 24.3 seconds
scanf version: 6.4 seconds
コンパイラーの最適化設定を変更しても、結果はほとんど変わりません。
したがって、実際には速度の違いがあります。
編集:ユーザーclyfish は、速度の違いは主にiostream I / O関数がCI / O関数との同期を維持しているためであると指摘しています。これをオフにするには、次を呼び出しますstd::ios::sync_with_stdio(false);
。
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
std::ios::sync_with_stdio(false);
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
新しい結果:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostreamが勝利しました! この内部同期/フラッシュは、通常、iostream I / Oの速度を低下させるものであることがわかりました。stdioとiostreamを混在させない場合は、オフにすることができ、iostreamが最も高速になります。
コード:https : //gist.github.com/3845568