none
Visual Studio 2019 デバッグ時のビルドが遅い RRS feed

  • 質問

  • 本日visual studio 2019 を更新したところ

    デバッグ時のビルドに凄く時間がかかるようになってしまいました。

    「ビルドを開始しました...」から20秒ほどしてから起動します。

    更新する前はそのようなことはありませんでした。

    設定箇所等ありましたら教えて頂けますでしょうか。

    よろしくお願い致します。

    2020年8月7日 4:47

回答

  • 13:21:35.964 2>ファイル "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets" 内にある、プロジェクト "***\ConferenceSystem.csproj" からのターゲット "IncrementalClean" (ターゲット "CoreBuild" は依存):
                       タスク "FindUnderPath"
                         比較パスは "bin\Debug\" です。
                       タスク "FindUnderPath" の実行が終了しました。
                       タスク "FindUnderPath"
                         比較パスは "obj\Debug\" です。
                       タスク "FindUnderPath" の実行が終了しました。
                       タスク "Delete"
                       タスク "Delete" の実行が終了しました。
                       タスク "RemoveDuplicates"
                       タスク "RemoveDuplicates" の実行が終了しました。
                       タスク "WriteLinesToFile"
                       タスク "WriteLinesToFile" の実行が終了しました。
    13:21:47.783     2>プロジェクト "ConferenceSystem.csproj" 内のターゲット "IncrementalClean" のビルドが終了しました。
    

    の赤と青の部分で時間がかかっているという事でしょうか?

    IncrementalCleanタスクはMicrosoft.Common.CurrentVersion.targetsを開いてみて該当場所を見ると

      <!--
        ============================================================
                                            IncrementalClean
    
        Remove files that were produced in a prior build but weren't produced in the current build.
        The reason is that if, for example, the name of the .exe has changed we want to delete the
        old copy.
    
        Leave the Clean cache file containing only the files produced in the current build.
        ============================================================
        -->
      <Target
           Name="IncrementalClean"
           DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
    
        <!-- Subtract list of files produced in prior builds from list of files produced in this build. -->
        <ItemGroup>
          <_CleanOrphanFileWrites Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanCurrentFileWrites)"/>
        </ItemGroup>
    
        <!-- Find all files in the final output directory. -->
        <FindUnderPath Path="$(OutDir)" Files="@(_CleanOrphanFileWrites)">
          <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInOutput"/>
        </FindUnderPath>
    
        <!-- Find all files in the intermediate output directory. -->
        <FindUnderPath Path="$(IntermediateOutputPath)"    Files="@(_CleanOrphanFileWrites)">
          <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInIntermediate"/>
        </FindUnderPath>
    
        <!-- Delete the orphaned files. -->
        <Delete
            Files="@(_CleanOrphanFileWritesInIntermediate);@(_CleanOrphanFileWritesInOutput)"
            TreatErrorsAsWarnings="true">
    
          <Output TaskParameter="DeletedFiles" ItemName="_CleanOrphanFilesDeleted"/>
    
        </Delete>
    
        <!-- Create a list of everything that wasn't deleted or was outside
                 the current final output and intermediate output directories. -->
        <ItemGroup>
          <_CleanRemainingFileWritesAfterIncrementalClean Include="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)" Exclude="@(_CleanOrphanFilesDeleted)"/>
        </ItemGroup>
    
        <!-- Remove duplicates. -->
        <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterIncrementalClean)">
          <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWritesAfterIncrementalClean"/>
        </RemoveDuplicates>
    
        <!-- Write new list of current files back to disk, replacing the existing list.-->
        <WriteLinesToFile
            File="$(IntermediateOutputPath)$(CleanFile)"
            Lines="@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)"
            Condition="'@(_CleanUnfilteredPriorFileWrites)'!='@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)'"
            Overwrite="true"/>
    
      </Target>

    となっていて、最後の方のRemoveDuplicatesタスクとWriteLinesToFileタスクに該当します。
    この部分を2017の頃のと比較してみても変更されていないので、このビルド定義が変わったわけではないようです。

    RemoveDuplicatesはInputsで受け取ったファイル参照配列から重複をなくしてるだけです。
    参照を見ているだけなのでファイルアクセスは発生せず、遅くなる要因はなさそうです。

    WriteLinesToFileはLinesで受け取った(RemoveDuplicatesで重複をなくした)ファイル参照をFileに一覧として書き出しています。
    こちらはFileに書き込みを行うので、内容が巨大な書き込み、あるいはファイルシステムに問題があれば遅くなる可能性はあります。
    実際の書き込み先は \obj\Debug\(プロジェクトファイル名).csproj.FileListAbsolute.txt になってます。

    このファイルが異常に大きくなっていないか、あるいは読み書きに不具合が無いかを調べてみるといいかもしれません。
    #それでも不明であれば\objと\binを完全に削除してみるとか

    最終手段としてはMicrosoft.Common.CurrentVersion.targets内のRemoveDuplicatesとWriteLinesToFileの箇所をコメントアウトしてしまうとビルド時間は短縮できるかもしれません。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年8月9日 0:48
    • 回答としてマーク kazu540 2020年8月11日 0:03
    2020年8月8日 13:44

すべての返信

  • 以下のどれですか?

    • プロジェクトのビルドだけなら速いのか?
    • 「デバッグ無しで実行」なら速いのか?
    • 「ビルドを開始しました。」から20秒とは、出力ウィンドウにその次の行が出るのが20秒なのか?
      (つまりビルドの開始そのものが遅い)
    • 「ビルドを開始しました。」から20秒とは、出力ウィンドウの出力の最後に表示される経過時間に20秒以上が表示されるのか?
      (つまりビルド処理のみが遅い)
    • 「ビルドを開始しました。」から20秒とは、WPFのプロセスが作られるまでが20秒なのか?
      (つまりプロセス起動のみが遅い)
    • 「ビルドを開始しました。」から20秒とは、WPFのメインウィンドウが表示されるまでが20秒なのか?
      (つまりウィンドウのみが作成が遅い)

    ビルドに時間がかかるのであれば、プロジェクトを読み込んだ状態で、メニュー->ツール->コマンドライン->開発者コマンドプロンプト で以下のコマンドを実行してどこに時間がかかっているか調査しましょう

    MSBuild.exe /v:d /target:Rebuild /clp:ShowTimestamp;PerformanceSummary;


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年8月7日 10:32
    2020年8月7日 10:31
  • gekka様

    ご丁寧に有難う御座います。

    20秒とお伝えしましたが正確に計測すると38秒でした。

    >プロジェクトのビルドだけなら速いのか?

    ビルドだけでも実測38秒かかります。

    >「デバッグ無しで実行」なら速いのか?

    デバッグ無しで実行でも同様に38秒かかります。

    >「ビルドを開始しました。」から20秒とは、出力ウィンドウにその次の行が出るのが20秒なのか?
    >(つまりビルドの開始そのものが遅い)
    >「ビルドを開始しました。」から20秒とは、出力ウィンドウの出力の最後に表示される経過時間に20秒以上が表示されるのか?
    >(つまりビルド処理のみが遅い)
    >「ビルドを開始しました。」から20秒とは、WPFのプロセスが作られるまでが20秒なのか?
    >(つまりプロセス起動のみが遅い)
    >「ビルドを開始しました。」から20秒とは、WPFのメインウィンドウが表示されるまでが20秒なのか?
    >(つまりウィンドウのみが作成が遅い)

    出力ウインドウに
    1>------ ビルド開始: プロジェクト: ***, 構成: Debug Any CPU ------
    1>  *** -> C:\***.exe

    (この間に38秒かかってます)

    ========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========


    >MSBuild.exe /v:d /target:Rebuild /clp:ShowTimestamp;PerformanceSummary;

    こちらのコマンドを実行してみたところ

    ここまで一気に進み

    ・タスク "RemoveDuplicates" の実行が終了しました。

    この後10秒程度かかってから
    一気に進みます。

    直後のコマンドは下記になります。

    ・タスク "WriteLinesToFile"
    ・タスク "WriteLinesToFile" の実行が終了しました。


    ビルドに成功しました。
    経過時間 00:00:16.46

    以上になります。

    Releaseにして「▶開始」では遅いことはありません

    使用環境はこちらになります。

    Microsoft Visual Studio Community 2019
    Version 16.7.0

    どうぞよろしくお願い致します。
    2020年8月8日 0:58
  • コマンドに/maxcpucountを追加して、ファイルをログに書き出してください
    細かい処理にタイムスタンプが付くようになります

    MSBuild.exe /v:d /target:Rebuild /clp:ShowTimestamp;PerformanceSummary; /maxcpucount > output.log

    「ビルドが完了しました」以降にビルドのどの処理で時間がかかっているかミリ秒で出力されてるので、どのタスクで時間がかかっているのかを調べます。

    WriteLinesToFileで時間がかかっていることが確定できたなら「ビルドが完了しました」よりも前でWriteLinesToFileを検索して何処のWriteLinesToFileなのかを調べます。
    (WriteLinesToFileタスクは複数のタスクから呼び出されるこのとあるタスク)

    #ログを全部提示してほしい


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年8月8日 2:39
  • gekka様

    お世話になります。

    文字制限で全てを張り付けることが出来ません。

    ハイパーリンクも挿入出来ませんでした。

    どうすればよろしいでしょうか。

    よろしくお願い致します。

    2020年8月8日 4:52
  • 何処かにアップロードしたリンクであれば、「本文に画像やリンクを含むことが出来ませんというエラーについて」を参考に権限を付与してもらうか、リンクと認識されないように頭のhttpを削った文字列にするなどで。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年8月8日 5:33
    2020年8月8日 5:32
  • gekka様

    お世話になります。

    ://1drv.ms/t/s!AlbYapkSZVZ570oApZSAHELf_vsP?e=fXhUdy

    httpsを削ってあります。

    どうぞよろしくお願い致します。

    2020年8月8日 5:59
  • 13:21:35.964 2>ファイル "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets" 内にある、プロジェクト "***\ConferenceSystem.csproj" からのターゲット "IncrementalClean" (ターゲット "CoreBuild" は依存):
                       タスク "FindUnderPath"
                         比較パスは "bin\Debug\" です。
                       タスク "FindUnderPath" の実行が終了しました。
                       タスク "FindUnderPath"
                         比較パスは "obj\Debug\" です。
                       タスク "FindUnderPath" の実行が終了しました。
                       タスク "Delete"
                       タスク "Delete" の実行が終了しました。
                       タスク "RemoveDuplicates"
                       タスク "RemoveDuplicates" の実行が終了しました。
                       タスク "WriteLinesToFile"
                       タスク "WriteLinesToFile" の実行が終了しました。
    13:21:47.783     2>プロジェクト "ConferenceSystem.csproj" 内のターゲット "IncrementalClean" のビルドが終了しました。
    

    の赤と青の部分で時間がかかっているという事でしょうか?

    IncrementalCleanタスクはMicrosoft.Common.CurrentVersion.targetsを開いてみて該当場所を見ると

      <!--
        ============================================================
                                            IncrementalClean
    
        Remove files that were produced in a prior build but weren't produced in the current build.
        The reason is that if, for example, the name of the .exe has changed we want to delete the
        old copy.
    
        Leave the Clean cache file containing only the files produced in the current build.
        ============================================================
        -->
      <Target
           Name="IncrementalClean"
           DependsOnTargets="_CleanGetCurrentAndPriorFileWrites">
    
        <!-- Subtract list of files produced in prior builds from list of files produced in this build. -->
        <ItemGroup>
          <_CleanOrphanFileWrites Include="@(_CleanPriorFileWrites)" Exclude="@(_CleanCurrentFileWrites)"/>
        </ItemGroup>
    
        <!-- Find all files in the final output directory. -->
        <FindUnderPath Path="$(OutDir)" Files="@(_CleanOrphanFileWrites)">
          <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInOutput"/>
        </FindUnderPath>
    
        <!-- Find all files in the intermediate output directory. -->
        <FindUnderPath Path="$(IntermediateOutputPath)"    Files="@(_CleanOrphanFileWrites)">
          <Output TaskParameter="InPath" ItemName="_CleanOrphanFileWritesInIntermediate"/>
        </FindUnderPath>
    
        <!-- Delete the orphaned files. -->
        <Delete
            Files="@(_CleanOrphanFileWritesInIntermediate);@(_CleanOrphanFileWritesInOutput)"
            TreatErrorsAsWarnings="true">
    
          <Output TaskParameter="DeletedFiles" ItemName="_CleanOrphanFilesDeleted"/>
    
        </Delete>
    
        <!-- Create a list of everything that wasn't deleted or was outside
                 the current final output and intermediate output directories. -->
        <ItemGroup>
          <_CleanRemainingFileWritesAfterIncrementalClean Include="@(_CleanPriorFileWrites);@(_CleanCurrentFileWrites)" Exclude="@(_CleanOrphanFilesDeleted)"/>
        </ItemGroup>
    
        <!-- Remove duplicates. -->
        <RemoveDuplicates Inputs="@(_CleanRemainingFileWritesAfterIncrementalClean)">
          <Output TaskParameter="Filtered" ItemName="_CleanUniqueRemainingFileWritesAfterIncrementalClean"/>
        </RemoveDuplicates>
    
        <!-- Write new list of current files back to disk, replacing the existing list.-->
        <WriteLinesToFile
            File="$(IntermediateOutputPath)$(CleanFile)"
            Lines="@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)"
            Condition="'@(_CleanUnfilteredPriorFileWrites)'!='@(_CleanUniqueRemainingFileWritesAfterIncrementalClean)'"
            Overwrite="true"/>
    
      </Target>

    となっていて、最後の方のRemoveDuplicatesタスクとWriteLinesToFileタスクに該当します。
    この部分を2017の頃のと比較してみても変更されていないので、このビルド定義が変わったわけではないようです。

    RemoveDuplicatesはInputsで受け取ったファイル参照配列から重複をなくしてるだけです。
    参照を見ているだけなのでファイルアクセスは発生せず、遅くなる要因はなさそうです。

    WriteLinesToFileはLinesで受け取った(RemoveDuplicatesで重複をなくした)ファイル参照をFileに一覧として書き出しています。
    こちらはFileに書き込みを行うので、内容が巨大な書き込み、あるいはファイルシステムに問題があれば遅くなる可能性はあります。
    実際の書き込み先は \obj\Debug\(プロジェクトファイル名).csproj.FileListAbsolute.txt になってます。

    このファイルが異常に大きくなっていないか、あるいは読み書きに不具合が無いかを調べてみるといいかもしれません。
    #それでも不明であれば\objと\binを完全に削除してみるとか

    最終手段としてはMicrosoft.Common.CurrentVersion.targets内のRemoveDuplicatesとWriteLinesToFileの箇所をコメントアウトしてしまうとビルド時間は短縮できるかもしれません。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年8月9日 0:48
    • 回答としてマーク kazu540 2020年8月11日 0:03
    2020年8月8日 13:44
  • 何気ないファイル操作に時間がかかるとしたら、ウィルススキャンですかねぇ? ウィルスソフトの動作ログなどがあるとわかるかもしれません。
    2020年8月8日 23:16
  • gekka様

    お世話になります。

    \binを削除しても変わらず\objを削除したら早くなりました。

    何度も有難う御座いました。助かりました。

    よろしくお願い致します。


    2020年8月11日 0:03