[解決済み] C++プログラムでscanf()を使用すると、cinを使用するよりも速いですか?
質問
本当かどうかわかりませんが、ある問題提供サイトのFAQを読んでいて、気になることがありました。
<ブロッククオート入出力メソッドを確認してください。C++では、cinとcoutを使うのは遅すぎます。これらを使うと、まともな量の入出力ではどんな問題も解決できないことが保証されます。代わりにprintfとscanfを使ってください。
誰かこのことをはっきりさせてください。本当に scanf() を使用するよりも高速です。 cin >> なんか ? もしそうなら、C++プログラムでそれを使うのは良い習慣なのでしょうか?私はC++を勉強しているところなのですが、C特有のものだと思っていました...。
どのように解決するのですか?
ここでは、標準入力から数値のリストを読み込んで、すべての数値を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
コンパイラの最適化設定を変えても、結果は全くと言っていいほど変わらなかったようです。
このように、本当にスピードに差があるんです。
EDITです。
ユーザー clyfish
以下、指摘
この速度差は、iostream の I/O 関数が C の I/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の入出力を遅くしていることが判明しました。 stdioとiostreamを混在させないのであれば、これをオフにすれば、iostreamが最も速くなります。
そのコードです。 https://gist.github.com/3845568
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜ[]はlist()よりも速いのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] "std::endl" vs "\n"