【STLとコードの最適化】競技趣味グラマの落ちた罠
CodeVSのAIを作っていた時にとても重要なことに気付いたので、記事として書き残しておきます。
※VisualStudioについての記事です
何が起きたのか
priority_queueを使っていた時のことです。
計算量は余裕だと思いながら普通にビルド・実行をしたんですが、不思議なことに実行すると3~5秒もかかってしまいました。
いつも通りバグだろうと思ってデバッグをしていたら、あることを思い出しました。
計算間に合わないと思ってたらスタックのコピーが原因だった
スタックをコピーしてたとき→1分くらい?
スタックを実装したとき→1,2秒
— 積分定数Cはないです (@wing3196) November 14, 2014
ちぎちゃん先輩が昔スタック使って通したらしいのでAOJからコード引っ張ってきて手元で実行したら1分くらいかかり、
提出したらACした
僕の1分かかるコードも提出すればACだったっぽい
学校のPCがやばい??
— 積分定数Cはないです (@wing3196) November 14, 2014
環境によってスタックの速度が違うとかやばすぎるーーー
— 積分定数Cはないです (@wing3196) November 14, 2014
Cup(AOJ0503)をstackを使って解いていた時に、コンパイルオプションでコードの最適化がされているかどうかによって実行速度が大幅に変わるという現象を体験したことがありました。
もしかして今回もコードの最適化をすれば直るのではないかと思いました。
解決策
最初VSのコンパイルオプションを見ると最適化が既にされていたので、あれ?と思ったのですが、ググったら色々情報が出てきました。
結論としては、
VisualStudioではビルドする時にDebugモードとReleaseモードがあるが、Debugモードではコードの最適化がされない
ということでした。
つまり解決策としては
最適化をしたい時はReleaseモードでビルド・実行すればよい(ビルド→構成マネージャー→アクティブ ソリューション構成)
です。
Debugモードで最適化ができなくなってるのは、デバッグ機能(F5で使えるやつ?)のためらしいです。
タイトルにSTLと入れてはいますが正直どういう条件で最適化に頼らなければいけなくなるのかはよく分かりません
しかしとりあえず、コンテナ系のSTLを使う時には気をつけるようにしようと思います(今までstackとpriority_queueで起こったので)。
では眠いのでこれで終わろうと思います。
明日から冬休みなのでコーディングし放題です!!