Search on the blog

2010年8月18日水曜日

衝撃の事実!cin, coutは遅かった。。

衝撃の事実が発覚した。。

c++のcin, coutは遅いようだ。。(これ常識なの??)

pkuを解いていて、たまに
「テストケースが非常に多いので、scanfの使用をお勧めします。」
みたいな文言を見ていたので何だろうと思っていたら、どうやらcinとscanfにはスピードに差があるよう。。。

同じようにcoutとprintfにも処理速度に差があるようだ。。
自分のローカルマシンで試してみたところ、
同様の処理をするのに、coutの方が1.5 - 2.0倍程度(表示行数100,000-1,000,000の場合)の時間を要していた。。

考えられる理由は以下の2つ。

①cin/coutはオーバーロード関数であるため、引数に応じてどのプロトタイプを使用するか決定しないといけない。scanf/printfはオーバーロードされていないため、このオーバーヘッドがない。

②scanf/printfはプログラマーが読み取る型をソース内で指定するのに対して、cin/coutは型の解釈を実行時に行わなければならない。

らしい。。

醜い争いが繰り広げられているので心臓の弱い方は上のURLにアクセスしないで下さい(笑)

とりあえず、今日の教訓は、コンテスト系の処理速度が求められる場面では、
「cin, cout より scanf, printfを使え!!」っていうことでした。

(でも、出力の場合は処理速度もさることながら、桁数指定とかが断然printfの方が楽ですよね。。。)

1 件のコメント:

  1. こんばんは、随分と古くなった記事へのコメントが野暮かもしれませんが気に掛かりましたので。

    この記事で理由として挙げられている①も②も翻訳時にコンパイラーが解決するので、実行時の速度には影響しません。

    本件について幾つか参考となりそうなリンクを添えます。
    http://qnighy.hatenablog.com/entry/20110115/1295054750
    http://www.mtoyoda.com/tdiary/?date=20060627
    http://xor.zoku-sei.com/Entry/30/

    返信削除