siempre me imaginé los archivos .pdb sólo eran utilizados por el depurador. Si el tiempo de ejecución siempre busca información de depuración, eso debería significar una ejecución más lenta al lanzar una excepción, porque tiene que leer el archivo .pdb, ¿verdad?
así que hice una prueba rápida:
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);
}
}
}
}
Esto sólo recursivamente 100 niveles de profundidad y produce una excepción. Ahora, para los resultados de tiempo de ejecución:
Operando como una depuración acumulación con la .pdb en la misma carpeta:
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
Correr como una depuración acumulación sin el PDB:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Ejecutando como versiónconstruir con el 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
Correr como una liberación construir sin el PDB:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Estos se ejecuta desde un símbolo del sistema de edad regular, no dentro de Visual Estudio. Por lo tanto, el .pdb definitivamente agrega información de rastreo de pila, y ralentiza el manejo de excepciones. ¡Muy interesante!
Entonces, ¿qué hace construir una aplicación en Release vs Debug? ¿cualquier cosa? Estoy acostumbrado al mundo de Java donde la depuración de compilación inserta la línea # sy otra información de depuración directamente en los archivos .class. – CodingWithSpike
Enlace aquí: http://social.msdn.microsoft.com/Foros/es-ES/clr/thread/4de6861f-e723-4def-bcaf-aa717a3e1897/ Resumen en depuración: sin optimizaciones, atributo [Debuggable] agregado, PDB implementado, #IF DEBUG compilado condicionalmente incluido, #IF RELEASE código no incluido –
+1 para deletrear mi nombre; ;) –