Я всегда считал, что файлы .pdb использовались только отладчиком. Если среда выполнения всегда проверяет их на предмет отладочной информации, это должно означать более медленное выполнение при возникновении исключения, поскольку оно должно читать .pdb, верно?
Итак, я сделал быстрый тест:
using System;
using System.Text;
namespace PdbSpeedTest
{
class Program
{
static void Main(string[] args)
{
DateTime start = DateTime.Now;
try
{
Program p = new Program();
p.Looper(0);
}
catch (NotImplementedException e)
{
Console.WriteLine(e.StackTrace);
}
TimeSpan span = DateTime.Now - start;
Console.WriteLine(span.TotalMilliseconds.ToString());
}
internal void Looper(int x)
{
try
{
if (x < 100)
Looper(x + 1);
else
throw new NotImplementedException("blah!");
}
catch (NotImplementedException e)
{
throw new NotImplementedException("blah!", e);
}
}
}
}
Это просто повторяет 100 уровней и создает исключение. Теперь для результатов выполнения:
Запуск в качестве отладки build с .pdb в той же папке:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x) in C:\Work\PdbSpeedTest\Program.cs:line 37
at PdbSpeedTest.Program.Main(String[] args) in C:\Work\PdbSpeedTest\Program.cs:line 16
31.2504
Запуск в качестве отладки build без .pdb:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Работает как релиз build с .pdb:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x) in C:\Work\PdbSpeedTest\Program.cs:line 37
at PdbSpeedTest.Program.Main(String[] args) in C:\Work\PdbSpeedTest\Program.cs:line 16
31.2504
Работает как релиз build без .pdb:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Они запускались из обычной старой командной строки, а не из Visual Studio. Так что .pdb определенно добавляет информацию трассировки стека и замедляет обработку исключений.
Очень интересно!