web-dev-qa-db-ja.com

Visual Studioでビルド時間を表示しますか?

ビルドサーバーは、C++プロジェクトの1つをビルドするのに時間がかかりすぎています。 Visual Studio 2008を使用しています。devenv.comにソリューション内の各プロジェクトのビルドにかかった時間を記録させる方法はありますか。

この場合、改善されたハードウェアはオプションではありません。

出力の詳細度を設定しようとしました(ツール/オプション/プロジェクトとソリューション/ビルドと実行/ MSBuildプロジェクトのビルド出力の詳細度)。これはIDEに影響を与えないようです。

コマンドラインからMSBuildを実行する場合(およびVisual Studio 2008の場合はMSBuild v3.5である必要があります)、最後に経過した合計時間が表示されますが、IDEには表示されません。

ソリューションの各プロジェクトの時間のかかるレポートが本当に必要だったので、ビルドプロセスに時間がかかっていた場所を把握できました。

あるいは、実際にNAntを使用してビルドプロセスを駆動するため(Jetbrains TeamCityを使用)、NAntに各ステップにかかった時間を通知する方法はありますか?

164
Roger Lipscombe

メニューツールオプションプロジェクトとソリューションVC++プロジェクト設定ビルドタイミング動作するはずです。

186
JesperE

[ツール]→[オプション]→[プロジェクトとソリューション]→[ビルドと実行]→[MSBuildプロジェクトのビルド出力の詳細-[通常]または[詳細]に設定すると、出力ウィンドウにビルド時間が表示されます。

79
Dave Moore

Visual Studio 2012〜2017

  • MSBuildプロジェクトの場合(例:すべての.Net-Projects):
    クリックTools -> Optionsを選択してからProjects and Solutions -> Build and Run。変化する MSBuild project build output verbosityからNormalへ。したがって、ビルドするすべてのソリューションプロジェクトで経過時間を表示します。しかし、残念なことに、すべてのプロジェクトに経過時間の合計はありません。ビルド開始のタイムスタンプも表示されます

  • FOR C/C++ Project:

Tools -> Optionsを選択してからProjects and Solutions -> VC++ Project Settings

変化する Build TimingからYesへ。

31
Sebastian

Visual Studio 2012では、 ビルドモニター 拡張機能を使用できます。

9
Oliver

VS2005にこだわっている場合は、 vs-build-timerプラグイン を使用できます。ビルドが完了すると、合計所要時間と各プロジェクト期間の(オプションの)要約が表示されます。

免責事項;私はそれを書きました。そして、はい、インストーラを作成する必要があります...ある日!

5
MattyT

ツール->オプション->プロジェクトとソリューション->ビルドと実行->

「MSBuildプロジェクトビルド出力の冗長性」を「最小」から「標準」に設定します

5
RaaFFC

あなたの質問はコマンドラインからDevEnvを使用することを伴うため、 MSBuild (変更せずに.slnファイルをビルドできます)を使用することもお勧めします。

msbuild /fl /flp:Verbosity=diagnostic Your.sln

msbuild /?は、ファイルロガーの他の便利なオプションを表示します。

4
Dave Moore

ビルドを視覚化する場合は、IncrediBuildを使用できます。 IncrediBuildは、Visual Studio 2015 Update 1の一部としてスタンドアロンモードで利用可能になりました(配布ではなく、ローカルマシンの8コアでのみ使用可能)

免責事項:私はIncrediBuildで働いています

3
buildops

ビルド出力に日付と時刻を含めたいだけだったので、ここで終わりました。他の人が似たようなものを検索する場合、プロジェクトの下のビルド前および/またはポストビルドイベントにecho %date% %time%を追加するのと同じくらい簡単ですプロパティコンパイルビルドイベント

2

最初にビルドを実行し、ビルド出力で最初に表示されるプロジェクトを確認します(Ctrl + Home 出力ウィンドウで)。そのプロジェクトを右クリック→プロジェクトプロパティコンパイルビルドイベントビルド前そして、echo ###########%date% %time%#############

そのため、ビルド結果が表示されるたびに(またはビルド中に) Ctrl + Home 出力ウィンドウで。そして、そのエリアのどこかで、あなたの顔を見つめています。

ああ、ビルドの順序が変わる可能性があるため、多くのプロジェクトにこれらの詳細を追加することになります:)


より良い解決策を見つけました! ###

ツールオプションプロジェクトとソリューションビルドと実行MSBuildプロジェクトビルド出力の冗長性 =通常(またはそれ以上最小)。これにより、出力ウィンドウの先頭/上部に時間が追加されます。 Ctrl + Home 出力ウィンドウで行う必要があります。

各プロジェクトにかかる時間を確認するには、Projects&SolutionsVC++ Project SettingsBuild Timing = yesすべてのプロジェクトに適用できます。 「VC++」は誤解を招くものです。

2
Blue Clouds

ビルド時間を測定し、グラフにイベントの順序を表示する拡張機能を作成しました: Visual Studio Build Timer

enter image description here

Visual Studioマーケットプレイスで入手でき、VS2015およびVS2017で動作します。

視覚的なプレゼンテーションは非常に役立ちました。どのプロジェクトに時間がかかるかを示すだけでなく、プロジェクト間の依存関係、つまり他のプロジェクトが開始する前に完了するのを待つプロジェクトも表示します。これにより、ビルドのボトルネックを特定し、ビルドの並列化を向上させるためにどの依存関係を解消する必要があるかを確認できます。

2
opetroch

オプション->プロジェクトとソリューション-> VC++プロジェクト設定->ビルドタイミング

enter image description here

1
Wesam

合計ビルド時間を追跡できる外部プログラムを呼び出したい場合は、VS 2010(およびそれより古いもの)で次のソリューションを使用できます。以下のコードは、Casey MuratoriによるCTimeを使用しています。もちろん、単にビルド時間を出力するために使用することもできます。

マクロエクスプローラーを開き、End Moduleの前に次を貼り付けます。

Dim buildStart As Date
Private Sub RunCtime(ByVal StartRatherThanEnd As Boolean)
    Dim Arg As String
    Dim psi As New System.Diagnostics.ProcessStartInfo("ctime.exe")
    If StartRatherThanEnd Then
        psi.Arguments = "-begin"
    Else
        psi.Arguments = "-end"
    End If
    psi.Arguments += " c:\my\path\build.ctm"
    psi.RedirectStandardOutput = False
    psi.WindowStyle = ProcessWindowStyle.Hidden
    psi.UseShellExecute = False
    psi.CreateNoWindow = True
    Dim process As System.Diagnostics.Process
    process = System.Diagnostics.Process.Start(psi)
    Dim myOutput As System.IO.StreamReader = process.StandardOutput
    process.WaitForExit(2000)
    If process.HasExited Then
        Dim output As String = myOutput.ReadToEnd
        WriteToBuildWindow("CTime output: " + output)
    End If
End Sub

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
    WriteToBuildWindow("Build started!")
    buildStart = Date.Now
    RunCtime(True)
End Sub

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
    Dim buildTime = Date.Now - buildStart
    WriteToBuildWindow(String.Format("Total build time: {0} seconds", buildTime.ToString))
    RunCtime(False)
End Sub

Private Sub WriteToBuildWindow(ByVal message As String)
    Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
    Dim ow As OutputWindow = CType(win.Object, OutputWindow)
    If (Not message.EndsWith(vbCrLf)) Then
        message = message + vbCrLf
    End If
    ow.OutputWindowPanes.Item("Build").OutputString(message)
End Sub

here および here からの回答。

1