编辑:主要编辑以消除我清晨的脑损伤。
为我的观点提供一些额外的信息,尝试显示可用于减少此数量异常的启动时间的步骤。此代码允许我分析 N 个调用,无论是否引发异常:
void Run(int n, bool doThrow, bool doExcept)
{
for (int i = 0; i < n; i++)
{
if (doExcept)
{
try
{
if (doThrow)
throw new NotImplementedException();
}
catch (NotImplementedException)
{
}
}
}
}
当在 Exceptions 对话框中未设置复选标记时,测试场景给出以下数字,在 VS 托管进程的调试模式下。
1; 4.000 msec
1: 0.000 msec (no throw)
1: 0.000 msec (no throw, no except)
10; 32.000 msec
10: 0.000 msec (no throw)
10: 0.000 msec (no throw, no except)
100; 780.000 msec
100: 0.000 msec (no throw)
100: 0.000 msec (no throw, no except)
1000; 7251.000 msec
1000: 0.000 msec (no throw)
1000: 0.000 msec (no throw, no except)
10000; 35694.000 msec
10000: 0.000 msec (no throw)
10000: 0.000 msec (no throw, no except)
很明显,正如您所料,异常的数量在这里很重要。我将在一分钟内使用来自不同场景的更多数字进行编辑。
在使用 VS 托管进程进行调试时,异常大约需要 3.5-7 毫秒。在调试模式下禁用 VS 托管进程(仍然允许调试)将时间降低到每个异常 1.9 毫秒:
1; 3.000 msec
10; 21.000 msec
100; 198.000 msec
1000; 1917.000 msec
10000; 19065.000 msec
没有 VS 托管过程的发布模式大约需要 1.8 毫秒(插入我的笔记本电脑后编辑):
1; 3.000 msec
10; 17.000 msec
100; 184.000 msec
1000; 1823.000 msec
10000; 18248.000 msec
在调试器之外以发布模式运行每个异常大约需要 0.016 毫秒:
1; 1.000 msec
10; 1.000 msec
100; 3.000 msec
1000; 19.000 msec
10000; 138.000 msec
因此,在我的测试设置中,它仍然不会从调试器“立即”加载,发布中有 10k 异常。不过,这可能与我之前在 2010 年安装时遇到的问题有关(我已经重新安装了)。它确实在调试器之外非常快速地加载。
这是我的完整测试台:
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
var p = new Program();
int[] tests = new int[] { 1, 10, 100, 1000, 10000 };
foreach (int n in tests) {
sw.Start();
p.Run( n, true, true);
sw.Stop();
Console.WriteLine(string.Format("{0}; {1:0.000} msec", n, sw.ElapsedMilliseconds));
sw.Start();
p.Run(n, false, true);
sw.Stop();
Console.WriteLine(string.Format("{0}: {1:0.000} msec (no throw)", n, sw.ElapsedMilliseconds));
sw.Start();
p.Run(n, false, false);
sw.Stop();
Console.WriteLine(string.Format("{0}: {1:0.000} msec (no throw, no except)", n, sw.ElapsedMilliseconds));
}
Console.WriteLine("Any key to exit...");
Console.ReadKey();
}