• 締切済み

実行時間に関するコト

コンパイルの「デバッグフラグ」と「最適化フラグ」の違いによる実効時間の差がなぜ生じるのか、という課題がポンッとだされたんですが、はっきり言って解りません。 完全な回答でなくてもいいので、どなたか、アドバイスください。

noname#4530
noname#4530

みんなの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.3

gcc(GNU C compiler)についてです。  私も気になったので簡単なプログラム(vector型に1~10000を順にpush してclearする、というのを10000回繰り返す)をつくって試してみました。  これを、「1.コンパイルオプション無し」「2.デバッグオプション有り」 「3.最適化オプション有り」「4.最適化オプション有り+デバッグ オプション有り」の4条件について、各20回ずつ実行し、得られた各20個の 実行時間データをt検定に掛けました。  まず、デバッグオプションについてですが、1、2、の間で実行時間に 有意な差は認められず、3、4、の間でも優位な差は認められませんでした。  この結果からは、gccにおいてはデバッグオプションを付けたからといって 実行時間が長くなるとは言えない、と言えます。  gccではデバッグオプションを付けた際に、余分なライブラリを リンクするのではなく、ソース内で指定された変数名などのシンボルを オブジェクトファイルに埋め込むだけであるため、実行時間に 有意な差は生じないのだと思います。(シンボルの分だけ実行ファイルの サイズは飛躍的に大きくなるので、少しは遅くなるのでしょうが、 上記のような小規模のプログラムでさえ、その影響は無視できるものの ようです)  しかし、上記の条件4.はgcc固有の、かなり特殊なもののようです。 すなわち、他のコンパイラではデバッグフラッグと最適化フラッグは 同時には指定できない、というのが一般的なようです。  その理由はalfeimさんのサンプルプログラムで明らかなように、 最適化をすると、ソースコード上での実行の流れと実際の実行の流れが 変わってしまう為です。  したがって、a-kumaさんが仰るような、デバッグオプションを付けると 最適化ができないので遅くなるというのは、gccにおいては成り立たないよう に思いますが、かなり一般的な現象なのではないかと思います。  もう一点、最適化オプションをつけると速くなるというのは自明ですね。 上記の1は3の、2は4のそれぞれ6倍の実行時間が掛かりました。 その理由としては、マシンの特性や、コンパイルの対象となる高級言語の コマンドが実行される文脈、などに依存した最適化が行なわれるためである、 ということになるんでしょうか。どのような最適化が行なわれるかは、 コンパイラやマシンに依るようです。  alfeimさんの例ですとか、実行回数がコンパイル時に分るような ループを展開するとか、変数をできるだけレジスタに割り当てるとか、 関数の再帰呼出しの最後の数回を展開するとか、 gccのマニュアルを見ただけでも色々あるみたいですね。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.2

デバッグフラグ: VisualC++では「標準では」最適化無効ですが、設定を変えれば最適化オプションをつけてデバッグ情報を付加できます。(でないとRelease版でのみ出るようなバグに対処できなくなりますから) デバッグフラグをつけてコンパイルした場合、対応ソースコードの対応行の指定や変数情報が付加され、VisualC++では確保した変数の自動初期化(コンパイルオプションによってはデバッグフラグを切っていても自動初期化する事は出来ますが・・・)やメモリ確保/開放関数の差し替え等があります。 デバッグのサポートをする命令が通常コンパイル時の命令群に付与されますので、実行速度は遅くなります。 最適化:  たとえば以下のようなソースコード for(int i = 0; i < 10; i++) { int a; /* 適当な処理 */ } のようなものがあった場合、ブロック内のint a;の宣言はデータ操作の副作用が無いので、ループ外で宣言しても実質変わりがありません。しかしマシン語レベルで比較すると、ループ内で変数確保をした場合、多くのCコンパイラではスタック操作の命令が実行されますので、最終的な結果を見る場合、ループ外で変数宣言をした方が、実行効率は良くなります。このような実行上、不都合はないが速度向上の邪魔になるものや、コードサイズの面で無駄なコードをシェイプしてくれるのが最適化です。 最適化にもいろいろあり、上記の例のような速度最適化やコードサイズの最適化等があります。 実際にどうなっているか等はコンパイラについての本やコンパイラのソースコードなどを読まれると良いかと思います。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

まず「最適化フラグ」から。 「最適化」は、分かりますか? ソースで書かれていることを、機械語に翻訳するときに、(何かが)最適になる ようにコンパイラが気を利かせてくれること、です。その「何か」には、実行速度 もありますので、最適化を指定する/しないで、実行速度(実行時間)が変わって くるのは、当たり前ですね。 次に「デバッグフラグ」について。 デバッグフラグ、というあたりで、Visual C++ っぽいんですが、ふつう、デバッグ のプロジェクトだと、最適化をしないようになります。つまり、最適化をしないから 遅くなる。 また、デバッグを指定したときには、デバッグ用のライブラリがリンクされるので すが、こいつらは、デバッグのために有効な情報を内部で抱えたりなど、普通の ライブラリに比べて、やってくれることが少し増えてます。 その処理が少し増えたことによって、処理速度が遅くなる、ということです。

関連するQ&A

  • 【スロット】フラグ選択周期時間について

    スロットの役判定フラグの周期時間について詳しい方がいらっしゃいましたら教えて頂けますでしょうか。 ここで質問する周期とは、Aというフラグが選択され、次にBというフラグが選択される間の時間の事で、ひらたく言うと1秒間にいくつのフラグが選択されているのかが知りたいのです。 ※情報元のサイトがあれば非常にうれしいです。 また上記、4号機と5号機に違いはありますでしょうか。 詳しい方どうかお力添えをお願いいたします。 広く多く情報を収集したい為、お礼に時間がかかる場合があります事をお許しください。

  • Visual C++ 2005のコンパイル方法

    Visual C++ 2005というソフトを使ってプログラミングをしているのですが、コンパイルの方法がわかりません。確か出力→デバッグ開始だっとような気がするんですが、デバッグができないのでコンパイルもできません。ちなみに元のソースは学校でLinuxでemacsを使用して作ったものなので、一からVisual C++ 2005で作ったものではありません。 回答お願いします

  • 「時間つぶし」と「時間稼ぎ」の違いについて

    「時間つぶし」と「時間かせぎ」の違いについて教えて下さい。 人に説明する為に考えていたら、明確な差がわからなくなってきました・・(^_^;)

  • eclipseでプログラムが実行できません

    プログラミング初心者です。 おかしな部分があるかと思います...。すみません...。 学校で出たC言語の課題を家でもやるために、eclipseをダウンロードしました。 MinGWもダウンロードしました。 C言語でプログラムを記述し、「すべてビルド」を押してから実行ボタンを押しましたが、「バイナリが見つかりません」というエラーが出てきてしまい、まったく実行できません。 ほかのサイトを参照しても、「コンパイル用のソフトをダウンロードしてありますか?」などの回答が多かったのですが、MinGWをダウンロードしてあるので何とも言えません。 プログラムはHello World!を表示させる程度の簡単なものです。 どのように操作をしたらうまく実行できるか教えてください。 また、eclipseとマイクロソフトのVisual Studioではどちらが使いやすいでしょうか。 ご回答よろしくお願いいたします。

  • 誤って make を実行してしまった

    FreeeBSD6.1 の環境です。 利用しているのは、さくらインターネットのレンタルサーバです。 教えて頂きたいのは、誤って /usr/ports/lang のディレクトリで、root で make を実行してしまいました。 10分程度コンパイルしていたと思います。 誤って make を実行してしまったため、今どのような状況になっているのか把握が出来ておりません。 ディレクトリ内を見ると下記のディレクトリが Gofer STk Sather TenDRA abcl make を実行した頃の時間になっています。 ちなみに、make install、make clean は実行していません 具体的に教えて頂きたい事は 1、make を実行した時点でコンパイルされたファイルが作成されたと思います。そのファイルは何処に保存されているのでしょうか。 2、現状このままで良いのでしょうか。 3、出来る事であれば、コンパイルしたファイルを削除したい。この場合、make clean を実行すれば良いのでしょうか。 以上3点に関してアドバイスを頂きたいと思います。

  • 短時間でも会いたい?ゆっくり会いたい?

    男女差で違いがあるのか、それとも単に個人差なのか、皆さんの好みを教えてください。 多忙で時間が不規則な社会人恋人同士です。 デートする場合、もし選べるなら、どちらのほうがいいですか? 1)短時間でもいいので、こまめに会う。週に1回くらい 2)半日や一日など長時間ゆっくり会う。月に2回くらい ちなみに私はどちらかというと頻繁に顔が見たいので1)タイプ なのですが、彼氏は2)みたいです。会う約束してても 急な仕事が入って、お茶するくらいの時間しかなくなってしまうと 「次に埋め合わせるから」とキャンセルするんです。 タイミングが合わなくなると1ヶ月会わないこともあります。

  • 時間がありません

    今年の4月から専門学校に入学したのですが、 宿題が出る(毎日)→帰ってから疲れて寝る→深夜に課題をやる、という繰り返しで 平日は1時間~2時間睡眠になってしまいます。 休日も土曜日は1日中寝て日曜日は何となくやる気がおきなくてダラダラ、 結局日曜の深夜に課題を始めて、また平日を寝不足で迎えるという生活を送っています。 余裕があったらバイトも始めたいなと考えていたのですが、今の生活ではバイトどころではありません・・・ 毎日学校に行くのが精一杯という感じになっています。 課題もだんだん決められた期限に出せなくなってきてしまって、 入学して半年も経っていないのになんだか精神的に疲れてきてしまいました。 みなさんは学生の頃どうやって上手くやりきってきたんでしょうか? やる気の出し方やアドバイスがありましたら教えていただけると嬉しいです。

  • サーブレット実行について

    コンパイルしてクラスファイルをつくって、トムキャット起動してURLからhttp://localhost:8080/YJKSample06/servlet/Sample10 と入力したら↓の様な画面が出ちゃいました。 HTTPステータス 404 - /YJKSample06/servlet/Sample10 type ステータスレポート メッセージ /YJKSample06/servlet/Sample10 説明 The requested resource (/YJKSample06/servlet/Sample10) is not available. Apache Tomcat/5.5.9 Sample10クラスとSample1クラスは同じ場所にあり、Sample1の方は        いらっしゃいませ!         お選びください。          りんご          みかん          いちご みたいな感じで画面表示されます。 Sample1とSample10は同じ場所にあり、Sample10もコンパイルされてクラスができたってことはソースに間違いなかったのでは??と、思うのです。 この違いに何かご存知の事がありましたらお教えいただけたらうれしいです。 過去この様なことを経験なさってる方のアドバイスもお待ちいたしております。 どうか宜しくお願いいたします。 情報が足りないようでしたら補足させていただきます。

    • ベストアンサー
    • Java
  • 食べた物が体に留まる時間について

     個人差や食材による違いも大きいかと思いますが、一般的に食べた物が体外へ排出されるまでの時間はどれ位なのでしょうか?

  • 少ない睡眠時間で起きる方法

    こんにちは 自分は中1なのですが、今テスト期間で 塾の宿題・テスト勉強・テストの課題・その他の学校の課題でどうしても早く寝れません。 学年末テストなので、課題の量も過去1・あと一週間近くでテストが来てしまいます。 自分は12時には寝ないと日中眠くなってしまうのですが、やるべきことをやると12時には寝れません。 一度次の日の授業を考えず朝の五時あたりまで勉強や課題をやっていましたが、それから七時まで寝ても目が痛いし、朝ごはんを食べると気持ち悪くなったりでほんとに体調が悪くなってしまいました。 長期間ショートスリーパーのような生活がしたいわけではないのですが、せめて一週間くらいは短時間の睡眠(7時間未満)で日中も活発に活動できるようにしたいです。 授業中にシャーペンを肌に刺したり隣の人に起こしてもらったりしましたがやはり眠気に耐えきれませんでした。 みなさんにアドバイスもらいたいです。 回答お願いします🙇