1. ホーム
  2. c++

[解決済み] C++プログラムでscanf()を使用すると、cinを使用するよりも速いですか?

2022-05-08 04:40:10

質問

本当かどうかわかりませんが、ある問題提供サイトの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