Visual Studio 2015以降の条件付きブレークポイントで低速化を防ぐ方法
Visual Studioでは条件付きブレークポイントを使用して、特定の値でデバッグする時に役立てることができます。
しかし条件付きブレークポイントをうっかりforループに仕込むと、劇的に処理時間が増大してデバッガの停止が強制的に必要になる場合があります。
もし条件付きブレークポイントで処理時間が大幅に増えなければ利用機会が増えて嬉しいのですが、IDEの設定などで対策はとれないものでしょうか。
下記は質問末尾のコードをVisual Studio Community 2017で実行した時の値です。
(コンパイラのおかげか、IF文の有無や呼び出し順で処理時間が変動する興味深い結果となりましたが、今回の質問とは直接関係ないと思いますので質問としてはスルーします)
デバッグ実行時間
ブレークポイントなし: 81 ms
IF文の中にブレークポイント: 101 ms
条件付きブレークポイント: 30884726 ms
通常実行(Ctrl+F5)時間
ブレークポイントなし: 77 ms
IF文の中にブレークポイント: 86 ms
条件付きブレークポイント: 69 ms
結局遅い時はif文を使ってデバッグしたい値でブレークポイントを記述するのですが、何となく機能を活用し切れていない点と、デバッグ用コードが混入する点がモヤッとします。
下記のコードについては、停止しないブレークポイントを設定することで処理時間を計ります。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(RunNormal());
Console.WriteLine(RunIfBreak());
Console.WriteLine(RunConditionalBreak());
Console.ReadLine();
}
private static string RunNormal()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
//単純に値を足すだけの処理
var sum = 0;
for(var i = 0; i < 10000; i++)
{
sum += i;
}
return string.Format("ブレークポイントなし: {0} ms", stopwatch.ElapsedTicks);
}
private static string RunIfBreak()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
//単純に値を足すだけの処理
var sum = 0;
for (var i = 0; i < 10000; i++)
{
#if DEBUG
if(i < 0)
{
Console.WriteLine("ここにブレークポイントを立てます");
}
#endif
sum += i;
}
return string.Format("IF文の中にブレークポイント: {0} ms", stopwatch.ElapsedTicks);
}
private static string RunConditionalBreak()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
//単純に値を足すだけの処理
var sum = 0;
for (var i = 0; i < 10000; i++)
{
sum += i; //ここに条件付きブレークポイント(i < 0)を立てます
}
return string.Format("条件付きブレークポイント: {0} ms", stopwatch.ElapsedTicks);
}
}
}