Windows

VisualStudio リリース版とデバッグ版の違い(実行速度も違う!)

*記事内に商品プロモーションを含む場合があります

Visual Studioは、Microsoftが開発した統合開発環境(IDE)で、プログラムの開発やデバッグに広く使用されています。

Visual Studioを使って、さまざまなプログラミング言語やプラットフォームでアプリケーションを開発することができます。

Visual Studioには、リリース版とデバッグ版という二つのビルド構成があります。

これらの違いについて説明します。

リリース版とデバッグ版の違いの概要

Visual Studioのリリース版とデバッグ版の違いの概要です。

詳細は、後程説明します。

リリース版とデバッグ版のビルド設定の違い

VisualStudioでは、ビルド構成の切り替えは簡単に行えます。ツールバーの「構成マネージャー」から、「アクティブソリューション構成」を選択して、「Debug」か「Release」かを指定するだけです。

メニューでの切り替えも可能です。

「プロジェクト」メニューから「プロパティ」を開いて、「構成プロパティ」タブで確認できます。

以下、ビルドの設定の違いの一例です。(画像をクリックすると大画面で表示可能です)

大きな違いは、デバッグライブラリの使用の有無と最適化の有無です。

「定義済みシンボル」や「最適化」などのオプションをカスタマイズすることもできます。

リリース版とデバッグ版の詳細

リリース版とデバッグ版の違いは何でしょうか?

簡単に言えば、リリース版は最適化されたコードでビルドされるのに対し、デバッグ版はデバッグ情報を含んだコードでビルドされます。これにより、以下のような違いが生じます。

リリース版の特性

リリース版は、デバッグ版よりも実行速度が速くなります。これは、最適化によって不要なコードが削除されたり、ループや分岐が効率的に処理されたりするからです。

デバッグ情報を持っていないので、Visual Studioでデバッグできません。

最適化については、以下の記事にまとめています。

C/C++コンパイラの最適化を知って最適なコードを書こうC/C++言語でコンパイラの最適化について紹介します。 この分野は奥が深いので、基本的なところを例で説明します。 コンパイラ...

デバッグ版の特性

デバッグ版は、リリース版よりもビルドされたモジュール(.exe/.dll/.libなど)のファイルサイズが大きくなります。

これはデバッグ情報を含むためです。デバッグ情報とは、変数名や行番号などの情報で、デバッガーがコードの実行状況を追跡するのに役立ちます。

デバッグ版は、リリース版よりもエラーの発見や修正が容易になります。このデバッグ情報によって、エラーの原因や発生箇所を特定しやすくなるからです。また、デバッグ版では、アサーションやブレークポイントなどのデバッグ用の機能を利用できます。

デバッグ版は、配布には専用のデバッグ用のランタイムDLLが必要になります。

Visual Studio 2022のリリースビルド版のランタイムDLLは、msvcr143.dllやmsvcp143.dllでマイクロソフトから配布用のインストーラが提供されていますが、デバッグ版は提供されていません。

ファイル名に”D”が付きます。msvcr143D.dll

Microsoft Visual C++ Redistributable latest supported downloads【公式】

では、どちらのビルド構成を使うべきでしょうか?

一般的には、開発中はデバッグ版を使ってテストやデバッグを行い、完成したらリリース版に切り替えて検査を行い配布するという流れが推奨されます。

デバッグ版で検査を行って問題なくても、配布用のリリース版で必ず検査を行ってください。

デバッグ版で顕在化しなかったバグがリリース版で発生することはよくあります。
たまたまデバッグ版では発生しなかっただけです。

変数の初期化漏れとか、処理のタイミングとかで動作が変わります。

リリース版とデバッグ版の性能差

Visual Studioで作成したプログラムで、リリースビルドとデバッグビルドで作成した性能差は数倍あります。(性能の幅は処理内容に依存します)

■確認内容
(1)STLのlistのデータを追加
(2)STLのlist のデータをソート
(3)関数の呼び出し。

■実行画面


■実行結果 (上記の実行画面を表にしただけです)

処理内容によって性能差があります。ビルドで作成されるファイルサイズも異なります。

この結果を見るとデバッグビルドで製品化(リリース)しようとは思わないでしょう。

■C++のプログラム
(Visual Studioで、そのままビルド可能です)

#include <iostream>
#include <list>
#include <algorithm>
#include <chrono>
#include <ctime>
#include <cstdlib>

double func1_count ;

void func1()
{
    func1_count++;
}
 
int main() {
    const int size = 5000000; // データの件数
	func1_count = 0;
 
    // 乱数初期化
    std::srand(static_cast(std::time(nullptr)));
 
    // リストの作成
    std::list myList;
 
    // (1)リストにデータの追加
    auto startAdd = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < size; ++i) {
        myList.push_back(std::rand());
    }
    auto endAdd = std::chrono::high_resolution_clock::now();
    std::chrono::duration elapsedAdd = endAdd - startAdd;
 
    // (2)リストのソート
    auto startSort = std::chrono::high_resolution_clock::now();
    myList.sort();
    auto endSort = std::chrono::high_resolution_clock::now();
    std::chrono::duration elapsedSort = endSort - startSort;
 
    func1();
  
    // (3)関数コール
    auto startFunc = std::chrono::high_resolution_clock::now();
    for (double i = 0; i < size*10; i++) {
        for (int k = 0; k < 10; k++) {
            func1();
        }
    }
    auto endFunc = std::chrono::high_resolution_clock::now();
    std::chrono::duration elapsedFunc = endFunc - startFunc;
 
    // 処理時間の表示
    std::cout << "Time taken to add data: " << elapsedAdd.count() << " seconds" << std::endl;
    std::cout << "Time taken to sort data: " << elapsedSort.count() << " seconds" << std::endl;
 
    std::cout << "Time taken to call func1 data: " << elapsedFunc.count() << " seconds" << std::endl;
    return 0;
}


■ビルド&実行環境
・Visual Studio Community 2022 (64 ビット) – Version 17.7.5
・Intel Core i7 13700H

リリース版ビルド作成時によくある問題

リリースビルドを作成するときによく発生する問題について、以下のURLの内容をもう少し分かりやすく解説します。

リリース ビルド作成時によくある問題【MS公式】

リリースビルドとは、アプリケーションを最適化して実行速度やメモリ使用量を改善するためのビルドです。

デバッグビルドとは異なり、リリースビルドではデバッグ情報やアサーションなどの開発用の機能が削除されます。これにより、アプリケーションのサイズやパフォーマンスが向上しますが、同時にデバッグが困難になる場合もあります。

リリースビルドを作成するときには、以下のような問題に注意する必要があります。

・デバッグビルドでは正常に動作するが、リリースビルドでは動作しない、または異なる実行結果になる

・リリースビルドで発生するランタイムエラー、メモリアクセス違反、未定義動作など

これらの問題の原因としては、以下のようなものが考えられます。

・デバッグビルドとリリースビルドでプロジェクト設定やコンパイラオプションが異なる
・デバッグビルドで有効になるデバッグ機能や初期化処理が、リリースビルドでは無効になる
・リリースビルドで有効になる最適化処理が、意図しない最適化での副作用がある

これらの問題を解決するためには、以下のような対策を行うことができます。
経験上、ほとんどがプログラムのバグです。

・初期化処理で明示的にコードで初期化する

・最適化レベルを下げるか、最適化処理を無効にする(実行性能は確認する)

・コードの品質や安全性を向上させるために、静的解析ツールなどを使う

アサーション(ASSERT)とは【MS公式】

結論

Visual Studioのリリース版とデバッグ版は、それぞれ異なる利用目的で開発されています。

リリース版は、一般的なユーザー向けの安定したアプリケーションを作成するために使用され、デバッグ版は開発者がプログラムのデバッグやトラブルシューティングを行うために使用されます。

開発の目的と要件に応じて、適切なバージョンを選択することが重要です。

■Visual Studioでデバッグ方法(初心者向け基本)を動画で紹介しています。

Kindle出版しました

Visual Studio デバッグ関連のブログ記事を再編集してアマゾンのKindle本で提供しています。

Kindle Unlimited会員は無料(0円)で読むことができます。
体系立てて学習した方はぜひご覧ください。

Kindle出版で技術本を出版するノウハウも記載しています。

IT技術者がKindle出版で技術書を副業で出版!収益や難易度は?(Amazonで販売可能)近年、副業を始めるIT技術者が増えています。その中でも、自身の知識や経験を活かせる「情報発信」は、注目度の高い副業の一つです。 K...