2010-08-20 12 views
8

Thay vào đó, có cách nào để biết liệu nó có được biên dịch với tham số tối ưu được bật hay vô hiệu hóa hay không. Tôi không muốn biết nếu nó được phát hành hay gỡ lỗi, vì có thể được kích hoạt có hoặc không có tối ưu hóa. Theo quan điểm của tôi, mặc dù mã cho biết đó là phiên bản phát hành, nó có thực sự được tối ưu hóa không? Cảm ơn.Có cách nào để biết liệu một assembly C# có được biên dịch với tham số tối ưu không?

Trả lời

6

Một cách để kiểm tra là xem DebuggableAttribute (doc) trên bản lắp ráp. Cờ DisableOptimizations sẽ không được đặt nếu trình biên dịch C# đã được chuyển tùy chọn/tối ưu hóa.

Lưu ý: Mặc dù điều này sẽ làm việc cho phần lớn các trường hợp nhưng đây không phải là giải pháp bằng chứng đánh lừa 100%. Nó có thể bị phá vỡ nó ít nhất trong những cách sau đây

  1. Biên soạn với một ngôn ngữ có ngữ nghĩa khác nhau để tối ưu hóa
  2. Nếu tay người dùng định nghĩa DebuggableAttribute nó sẽ được ưu tiên hơn những gì mà biên dịch C# định nghĩa
+0

1. có lẽ không phải là một vấn đề, vì câu hỏi về hội đồng C#, tuy nhiên, sẽ không 2. vẫn hợp lệ (nếu người dùng ghi đè thuộc tính, không phải là loại bỏ tối ưu hóa thời gian chạy và do đó hội đồng có thể được coi là không được tối ưu hóa?) – Zaki

+0

@Zaki có và không. Tối ưu hóa JIT sẽ bị vô hiệu hóa nhưng các tối ưu hóa trình biên dịch C# khác sẽ không được kích hoạt. – JaredPar

+1

/optimization ==/optimization- –

5

Nhìn vào biểu hiện lắp ráp với Ildasm.exe:

// --- The following custom attribute is added automatically, do not uncomment ------- 
    // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(
      valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) 
      = (01 00 02 00 00 00 00 00) 

Đó là phiên bản phát hành. Giá trị xây dựng gỡ lỗi là (01 00 07 01 00 00 00 00)

Một nếp nhăn khác là trình gỡ lỗi có thể vô hiệu hóa trình tối ưu hóa JIT. Đó là một tùy chọn cấu hình trong VS, Tools + Options, Debugging, General, "Suppress JIT tối ưu hóa trên tải module". Bạn muốn điều đó xảy ra nếu bạn đang gỡ lỗi bản Xây dựng bản phát hành và muốn có được sự hoàn hảo tương tự. Nó làm cho việc gỡ lỗi trở nên khó khăn hơn, các hành vi bước kỳ lạ khi trình tối ưu hóa sắp xếp lại và inline mã và bạn thường không thể kiểm tra các giá trị của các biến cục bộ vì chúng được lưu trữ trong thanh ghi CPU.

+0

Khi tôi thiết lập để kích hoạt, C# "Tối ưu hóa mã", và xây dựng lại trong gỡ lỗi, tôi vẫn thấy các giá trị gỡ lỗi bạn đang tham khảo. // --- Thuộc tính tùy chỉnh sau được thêm tự động, không bỏ ghi chú ------- // .tùy chỉnh tùy chỉnh void [mscorlib] System.Diagnostics.DebuggableAttribute ::. Ctor (valuetype [mscorlib] System .Diagnostics.DebuggableAttribute/DebuggingModes) = (01 00 07 01 00 00 00 00) – John

+0

Tôi vừa kiểm tra lại với VS2012. Không, vẫn hoạt động như tôi đã mô tả.Đừng quên xây dựng lại sau khi thay đổi tùy chọn. –

+0

Cảm ơn bạn. Tôi nhận được những gì tôi đã mô tả ở trên khi mã không được tối ưu hóa, phù hợp với mô tả của bạn, nhưng khi tôi đã tối ưu hóa, đặt theo mặc định trong chế độ Phát hành, không có đề cập đến thuộc tính gỡ lỗi nào trong tệp kê khai. Vâng, điều này mâu thuẫn với tuyên bố của tôi ở trên, xin lỗi. Tôi sẽ tiếp tục xem xét các hội đồng của mình và xem liệu tôi có thể thấy DebuggableAttribute với giá trị xây dựng mà bạn đã đề cập hay không - khi mã được thiết lập để tối ưu hóa. Đây là VS2010. Cảm ơn. – John