アプリ版:「スタンプのみでお礼する」機能のリリースについて

DebugとReleaseモードで作成された実行ファイルの速度の違いですが、
一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)

リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか?

このあたりの理解をしっかりしたいのですが、参考になる書籍をご存知の方、教えてください。

A 回答 (6件)

とりあえず,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 …
などにもありますが,結局は「キャッシュミスやページフォールトを減らす」が一番効果的だったりします。
もちろん,最適化オプションによってコードが小さくなったり重複する定数がまとめられたりして局所化が進む分減るでしょうが,


> リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか?

MSDN : リリースビルドの作成
http://msdn.microsoft.com/ja-jp/library/cc367889 …
を読んでください。デフォルトの「リリースビルド」構成において,「デバッグビルド」構成に比べて何が行われるのか書いてあります。
なお,ビルド構成は任意に作成できる物なので,デバッグ情報を付加して最適化オプションを有効化することもできます。
    • good
    • 1

使用するコンパイラにも拠りますが、通常、以下のような違いが出ます。



・最適化をするか、最適化をしないか
・最適化をするとしてもソースコードの1行単位の最適化をするか、関数単位の最適化をするか

関数単位での最適化では、場合によっては、複数行に渡っての最適化が行われ「プログラムコードを行単位に分ける事が不可能」になります。

つまり「ソースコードのこの行は、プログラムコードのこのアドレス」と言うのが不明確になるのです。

下手をすると関数の実体そのものが無くなってしまう事もあります。

そうすると「ソースコード単位でのトレース」が出来なくなりますから、デバッグモードでは極端な最適化はしません。最適化をするとしても「ソースコードの1行単位」です。

・デバッグライブラリを使用するか、リリースライブラリを使用するか

デバッグライブラリを使用した場合、通常、ライブラリ内で例外が起きるとトラップされてデバッガやアプリに対して例外が送出され、アプリが落ちたりする事は少ないです。

しかし、リリースライブラリの場合、ライブラリ内での例外はトラップされないので、アプリ側で事前に例外をトラップしておかない場合、例外発生でいきなりアプリが落ちます。

なので「引数が常に正しく、ライブラリで例外が起きる事はない」と判っている場合、例外トラップの前処理が無い分、リリースライブラリの方が高速になる傾向があります。

またライブラリを「実行時ランタイムDLL」に指定しておいた場合、デバッグビルドのままだと「一般に配布されていない、デバッグ用DLLを実行時に要求する」ので、コンパイルしたパソコン以外で動かせない可能性があります(デバッグビルドでも、全ライブラリを実行ファイルに内包するモードでビルドした場合は、他のパソコンでも動かせます)

それ以外では、大きな違いはありません。

なお、最近のコンパイラは、デバッグモードでビルドすると、ソースコードデバッグに必要な情報を実行ファイルとは別に作るので、大昔のように「デバッグ情報が実行ファイルに含まれてて実行ファイルのサイズが肥大」と言う事は起きない傾向にあります。
    • good
    • 3

組込み系の話で、特にルネサスのHEW(コンパイラなどIDE)の場合に


リリースモードとデバッグモードでそれぞれビルドできます。

最近は、デバッグ確認した状況と変えて出荷したくないという
ことから、デバッグモードのまま出荷されることが多くなっているようで
そのことからデバッグモードにおいてもかなりコンパイラの最適化する
設定になっているようです。この場合、当然速度的には変わりありません。
ただしデバッガーサポートのための命令が追加される場合があり、
その場合に若干コードが増える程度です。
大きな違いはデバッグ情報が含まれるためにバイナリサイズが大きくなっている
ことぐらいです。

ただコンパイラなどMPU毎に対応が異なるのですべてそうなっている
わけではありませんが、比較的新しいものはそうなっているようです。

この辺はPCのソフトウエアの常識とかなり違っていうるようですね。
    • good
    • 4

VC++だとして答えます。


デバッグビルドしたものは他人に配布しても動きません。なので他の人に配布するならリリースビルドが基本となります。

>DebugとReleaseモードで作成された実行ファイルの速度の違いですが、
>一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)

私の経験では最大2倍ぐらい差が出たことがあります。
デバックビルドは最適化されませんので、コードの実行効率が悪いです。

>リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか?

デバッグのための情報が付加されています。
    • good
    • 0

>一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)


既に回答されているように、そのコードに依存するでしょう。
#ほとんど差がない場合から数倍の差になるくらいまで・・

かなり前、VC.NET(2002)とVC6で円周率(20000桁)計算をして
比較した結果です。

           Debug  Release
  結果:VC6      91秒   33秒
     VC.NET     81秒   78秒
    • good
    • 2

プログラムの内容やステップ数にもよりますので概算しか出来ませんが、デバッグモードの方が50%以上遅いのではないでしょうか。



デバッグモードではデバッグ情報が付与されています。
これにより、現在実行中のプログラムがソースコード上ではどこにあたるのか分かるようになります。
例えばプログラムが異常終了したりすると、デバックモードでソース上と比較しながら実行する事で、ソースの何行目で落ちるのか分かります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています