• ベストアンサー

リリースモードとデバッグモードの違い (具体的な違い)

DebugとReleaseモードで作成された実行ファイルの速度の違いですが、 一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか) リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか? このあたりの理解をしっかりしたいのですが、参考になる書籍をご存知の方、教えてください。

  • roox2
  • お礼率1% (1/79)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

とりあえず,Visual C++を前提に話を進めます。 > DebugとReleaseモードで作成された実行ファイルの速度の違いですが、 > 一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか) 内容次第です。 極端な例ですが, int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) { return MessageBoxA(0, "Hello, World!", "", MB_OK); } について,どれだけの差があるかと言われても,まずないでしょう。 # ついでに,リンカオプションでWinMainを本当のエントリポイントにすると効果的。 差が付く可能性があるのは,自分の書いたコードがCPUを相手に頑張る場合です。 その,非常に局所的な部分だけを見れば,何倍とかもあり得るでしょうが (実行時の計算を省くので∞,なんてこともある), 全体で見ると,数値計算を主とするプログラムを除いて,大した数字にはならないと思います。 # コンパイラの支配下から外れる部分が大半になるでしょうし。 MSDN : タイムクリティカルなコードを最適化するためのヒント http://msdn.microsoft.com/ja-jp/library/eye126ky.aspx などにもありますが,結局は「キャッシュミスやページフォールトを減らす」が一番効果的だったりします。 もちろん,最適化オプションによってコードが小さくなったり重複する定数がまとめられたりして局所化が進む分減るでしょうが, > リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか? MSDN : リリースビルドの作成 http://msdn.microsoft.com/ja-jp/library/cc367889.aspx を読んでください。デフォルトの「リリースビルド」構成において,「デバッグビルド」構成に比べて何が行われるのか書いてあります。 なお,ビルド構成は任意に作成できる物なので,デバッグ情報を付加して最適化オプションを有効化することもできます。

その他の回答 (5)

  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.6

使用するコンパイラにも拠りますが、通常、以下のような違いが出ます。 ・最適化をするか、最適化をしないか ・最適化をするとしてもソースコードの1行単位の最適化をするか、関数単位の最適化をするか 関数単位での最適化では、場合によっては、複数行に渡っての最適化が行われ「プログラムコードを行単位に分ける事が不可能」になります。 つまり「ソースコードのこの行は、プログラムコードのこのアドレス」と言うのが不明確になるのです。 下手をすると関数の実体そのものが無くなってしまう事もあります。 そうすると「ソースコード単位でのトレース」が出来なくなりますから、デバッグモードでは極端な最適化はしません。最適化をするとしても「ソースコードの1行単位」です。 ・デバッグライブラリを使用するか、リリースライブラリを使用するか デバッグライブラリを使用した場合、通常、ライブラリ内で例外が起きるとトラップされてデバッガやアプリに対して例外が送出され、アプリが落ちたりする事は少ないです。 しかし、リリースライブラリの場合、ライブラリ内での例外はトラップされないので、アプリ側で事前に例外をトラップしておかない場合、例外発生でいきなりアプリが落ちます。 なので「引数が常に正しく、ライブラリで例外が起きる事はない」と判っている場合、例外トラップの前処理が無い分、リリースライブラリの方が高速になる傾向があります。 またライブラリを「実行時ランタイムDLL」に指定しておいた場合、デバッグビルドのままだと「一般に配布されていない、デバッグ用DLLを実行時に要求する」ので、コンパイルしたパソコン以外で動かせない可能性があります(デバッグビルドでも、全ライブラリを実行ファイルに内包するモードでビルドした場合は、他のパソコンでも動かせます) それ以外では、大きな違いはありません。 なお、最近のコンパイラは、デバッグモードでビルドすると、ソースコードデバッグに必要な情報を実行ファイルとは別に作るので、大昔のように「デバッグ情報が実行ファイルに含まれてて実行ファイルのサイズが肥大」と言う事は起きない傾向にあります。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.5

組込み系の話で、特にルネサスのHEW(コンパイラなどIDE)の場合に リリースモードとデバッグモードでそれぞれビルドできます。 最近は、デバッグ確認した状況と変えて出荷したくないという ことから、デバッグモードのまま出荷されることが多くなっているようで そのことからデバッグモードにおいてもかなりコンパイラの最適化する 設定になっているようです。この場合、当然速度的には変わりありません。 ただしデバッガーサポートのための命令が追加される場合があり、 その場合に若干コードが増える程度です。 大きな違いはデバッグ情報が含まれるためにバイナリサイズが大きくなっている ことぐらいです。 ただコンパイラなどMPU毎に対応が異なるのですべてそうなっている わけではありませんが、比較的新しいものはそうなっているようです。 この辺はPCのソフトウエアの常識とかなり違っていうるようですね。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

VC++だとして答えます。 デバッグビルドしたものは他人に配布しても動きません。なので他の人に配布するならリリースビルドが基本となります。 >DebugとReleaseモードで作成された実行ファイルの速度の違いですが、 >一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか) 私の経験では最大2倍ぐらい差が出たことがあります。 デバックビルドは最適化されませんので、コードの実行効率が悪いです。 >リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか? デバッグのための情報が付加されています。

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.3

>一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか) 既に回答されているように、そのコードに依存するでしょう。 #ほとんど差がない場合から数倍の差になるくらいまで・・ かなり前、VC.NET(2002)とVC6で円周率(20000桁)計算をして 比較した結果です。            Debug  Release   結果:VC6      91秒   33秒      VC.NET     81秒   78秒

  • mainPC
  • ベストアンサー率21% (62/287)
回答No.1

プログラムの内容やステップ数にもよりますので概算しか出来ませんが、デバッグモードの方が50%以上遅いのではないでしょうか。 デバッグモードではデバッグ情報が付与されています。 これにより、現在実行中のプログラムがソースコード上ではどこにあたるのか分かるようになります。 例えばプログラムが異常終了したりすると、デバックモードでソース上と比較しながら実行する事で、ソースの何行目で落ちるのか分かります。

関連するQ&A

  • デバッグ開始でbin\Releaseにファイルが作成されてしまう。

    デバッグ開始でbin\Releaseにファイルが作成されてしまう。 Visual Studio 2008でC#によるWindowsアプリケーションを作成しているのですが、デバッグ開始を実行するとbin\Releaseにexeファイルなどが作成されてしまいます。 ビルドするとbin\Releaseにexeファイルなどが作成されます。 デバッグ開始の実行でbin\Debugにexeファイルなどが作成され、ビルドするとbin\Releaseに作成されるようにしたいのですが、どうすれば良いですか? ちなみに***.vshost.exeはbin\Releaseに作成されます。 これもbin\Debugに作成されるようにしたいです。

  • VC++でDeugモードOKで、Releaseモードのみでエラーが出る?

    マイクロソフトのVisualC++で テキストデータを処理するプログラミングしています。 (MFCは使っていません。) 使用してたプログラムの 一部の変数をクラス化しました。 数多くのエラーをかいくぐり、 Debugモードでは、 目的の演算を実行することができるようになりました。 ところが、 このプロジェクトをReleaseモードでビルド実行すると、 「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました。」 というエラーが出て止まってしまいます。 プロジェクトのプロパティ設定で、 ヒープ領域をDebugモードと 同じにしてみたりしたのですが、 状況は改善されません。 メモリの問題のような気がして、 配列の大きさ等をチェックしましたが、 問題なしでした。 プログラムを他の人が使えるように するためには、 Releaseモードが必要なので困っています。 どなたか、アドバイスかご教示お願いします。 デバッグ方法を教えて頂いても大変助かります。 よろしくお願いします。

  • リリースビルドの作成

    VisualC++ 2005 Express Editionを使って、C言語の簡単なプログラムを作りました。コンパイルの際に出てくるエラーや警告は一切ない(デバッグモード、リリースモード両方)のですが、このリリースビルドをVC++をインストールしていないPCで実行しようとすると、「指定されたプログラムは実行できません。」と出て実行できません。コンパイルに使ったPCでは実行できます。 リリースビルドを作成の際、ツールバーにある"Debug"を"Release"に切り替えて、ソリューションをビルドしました。プロジェクトはWin32コンソールにして、空のプロジェクトから始めました。 なぜ、バイナリが実行できないのでしょうか? そもそも、リリースビルドの作成法はこれでいいのでしょうか?

  • VS2008 C++ リリースモードでエラー

    表題の環境でMFCベースのプログラムを開発しています。 リリースモードで実行を試したところ、同じようなタイミングで強制終了が発生します。 (おそらく、自前のDLL内で落ちている?) デバッグモードのEXEを直接起動しても、強制終了が発生します。 りかし、VSからリリースモード(当然、デバッグモードも)の実行を行うと、エラーが発生しません。 VSから実行する場合、参照するDLLはVSを使用しない場合とは違うDLLを参照するのでしょうか。 その他、このような状況での対処方法について、アドバイスをいただけませんでしょうか。

  • Release用にもDebug用にも使えるライブラリの作り方

    皆さんこんにちは。 MFCでスタティックライブラリをつくっています。 ライブラリのコンパイルの際に、ReleaseかDebugの いずれかを指定しますが、それぞれのモードで つくったライブラリは、それぞれのモードの実行 ファイルにしかリンクできないのでしょうか? どちらのモードの実行ファイルにもリンク可能な ライブラリをつくることは可能でしょうか? もし可能な場合、どのような手順でつくれば よいのでしょうか? どうぞよろしくお願いいたします。

  • C# デバッグモード"と"デバッグなしモードで答えが違う。

    //8が2の何乗か求めるプログラム。 using System; class Class1 {  static void Main() {   int a = (int)Math.Log(8.0,2.0);   double b = Math.Log(8.0,2.0);   if(b%1.0==0.0) Console.WriteLine("bは整数です");   else Console.WriteLine("bは整数ではありません");   Console.WriteLine("a={0} b={1}",a,b);   Console.Write("\n何かキーを押して");   Console.Read();   } } 答えはa=3 b=3.0を予想していました。 C#.Net2003でコンパイルして実行した所、 デバッグモードで実行した時の答え:  bは整数です。  a=3 b=3 デバッグなしモードで実行した時の答え:  bは整数ではありません。  a=2 b=3 でした。 ★質問1 これはC#.Net2003のバグなんでしょうか? それとも、私がデバッグモードの仕様をきちんと理解していないだけでしょうか?? ★質問2 8が2の何乗かをint型で解を取得したい場合、 (int)Math.Round(Math.Log(8.0,2.0))のようにわざわざ書かないといけないのでしょうか? 以上、アドバイスよろしくお願いします。

  • デバッグビルドとリリースビルドで計算結果が違う

    こんにちは。 VC++.netで暗号化ソフトを作っているんですが、デバッグモードで実行した結果と、リリースモードで実行して得られる結果が違うので困っています。 原因としては、何が考えられるでしょうか? warningで、「warning C4267: '=' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。」と表示されましたが、(int)でキャストしてから警告は出なくはなっているんですが。 もう一つ、「LINK : warning LNK4089: 'SHELL32.dll' へのすべての参照は /OPT:REF によって廃棄されます。」と出ていますが、これは関係なさそうですので無視しています。 もしかして、同じような経験をされた方がいるんではないかと思い質問しました。 よろしくお願いします。

  • VC Debugモード

    Visual Stdio .NET 2003 環境のDebugモードについて質問があります。 開発言語は C++です。 今、コマンドライン引数を以下のように設定し、ファイルに保存された 情報を処理するプログラムを作成しています。 test1.exe 0 ./input.txt ↑ [実行ファイル名][検索したい文字][処理したいファイルへのパス] 上のように入力した場合、argcは[3]を返すと思うのですが、Debug モードでいざ実行してみると、値は「4」となっていました。 コマンドライン引数はVCの「プロジェクト」→「**のプロパティ」 →左ウィンドウの「デバッグ」→右ウィンドウの「コマンド引数」に 上のように設定しています。 また、Debugモードでargv[0]を調べたところ、実行ファイルまでのパス が保存されていました。 なぜ、このようになるのでしょうか? あと本題からそれるのですが、ソースの中でVCがDebugモードで動作していることを知る方法はないでしょうか? もし、Debugモードなのかどうかがわかるのであれば、ソースをDebug モード用とReleseモード用とに切り替えられるようにしたいのですが。。。 合わせてお教えください。

  • リリースビルドで遅くなる

    非常に大量のコードを書いた後で気づいたので 挙動からおそらくその辺だと「思われる」のですが Windows XP SP 3で、Visual C++で デバッグビルド・リリースビルドしたときの速度を比較してみると おそらく、メモリマップドファイル絡みの個所で  現状なぜかリリースビルドの方が遅くなります。 巨大なファイルを1度扱ってから再度ほぼ同じ個所を使用した時 デバッグビルドではその間にアプリケーションを1度終了したとしても、その後別に巨大なファイルを使ったりしなければ どうもシステム的に(?)何らかのキャッシュが効いているようで 1回目で23秒程度かかる処理が、2回目以降は7秒弱で出来てしまいます。 (これは100回やったら99回以上はなるんでは?というくらい安定しています) 対してリリースビルドでは 最初の1回は同じくらいですが 2回目以降でも16秒程度はかかってしまう感じです。 なお、そのけた外れに長い演算の末に出来上がるfloatの配列は、デバッグビルド・リリースビルドで端から端まで完全に一致する、という確認もできています。 アプリ的に 2回目以降の時間を短縮できた方が非常に都合が良いのですが ビルドの設定はほとんど同じですが、これは仕様でしょうか? もしこれがキャッシュの方式の問題、であるのなら Windows APIなどを使うことにより対処可能な問題でしょうか? あるいは、デバッグビルド・リリースビルドの違いによるものではなく このアプリケーションのデバッグビルドによって出来た実行ファイルの方に 以前関連付けを行ったりするように(アイコンや、独自ファイル形式ダブルクリックで開けるように) レジストリを書き換えたのですが これによってシステムから「なんらかの優先事項」を享受できるようになっているため だったりする、という可能性もあるのでしょうか?

  • Releaseモードで実行すると出るエラー

    現在Visual C++を用いてOpenGLを用いたプログラムを作成しています. だいぶ苦労しましたが,ある程度できてきました.しかし,Debugモードで実行するとエラーは出ないのですが,Releaseモードで実行するとエラーが出てしまいます. エラーの内容は以下のとおりです. 「0x0040530f でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000010 を読み込み中にアクセス違反が発生しました。」 エラーは_sftbuf.cの→のところで出るようなのですがこの原因はどのようなものが考えられるのでしょうか? int __cdecl _stbuf ( FILE *str ) { REG1 FILE *stream; int index; _ASSERTE(str != NULL); /* Init near stream pointer */ stream = str; /* do nothing if not a tty device */ → if (!_isatty(_fileno(stream))) return(0); /* Make sure stream is stdout/stderr and init _stdbuf index */ if (stream == stdout) index = 0; else if (stream == stderr) index = 1; else return(0); また,Releaseモードで作成したexeファイルをOpenGLのdllが入っていないPCで実行することはできないのでしょうか? よろしくお願いします.

専門家に質問してみよう