tôi luôn luôn tìm các tập tin PDB chỉ được sử dụng bởi các chương trình gỡ rối. Nếu thời gian chạy luôn kiểm tra chúng để biết thông tin gỡ lỗi, điều đó có nghĩa là thực thi chậm hơn khi ném một ngoại lệ, bởi vì nó phải đọc tệp .pdb, phải không?
Vì vậy, tôi đã thực hiện một thử nghiệm nhanh:
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);
}
}
}
}
chỉ này recurses 100 cấp độ sâu và ném một ngoại lệ. Bây giờ cho kết quả thời gian chạy:
Chạy như một debug build với các PDB trong cùng thư mục:
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
Chạy như một debug build mà không các PDB:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Chạy dưới dạng release xây dựng với các 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
Chạy như một thông cáo xây dựng mà không các PDB:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
Chúng được chạy từ một dấu nhắc lệnh cũ thường xuyên, không phải bên trong Visual Studio. Vì vậy, các .pdb chắc chắn không thêm stack theo dõi thông tin, và làm chậm xử lý ngoại lệ. Rất thú vị!
Vì vậy, những gì xây dựng một ứng dụng trong Release vs Debug làm gì? có gì không? Tôi đã quen với thế giới Java, nơi biên dịch gỡ lỗi chèn dòng # s và thông tin gỡ lỗi khác trực tiếp vào các tệp .class. – CodingWithSpike
Liên kết tại đây: http://social.msdn.microsoft.com/Diễn đàn/en-US/clr/thread/4de6861f-e723-4def-bcaf-aa717a3e1897/ Tóm tắt trong Gỡ lỗi: Không tối ưu hóa, [Debuggable] thuộc tính được thêm vào, PDB được triển khai, #IF DEBUG có điều kiện được biên dịch bao gồm, #IF RELEASE mã không được bao gồm. –
+1 để đánh vần tên của tôi đúng ;-) –