26

Phần lớn mã phát hành C# của chúng tôi được xây dựng với tùy chọn 'Tối ưu hóa mã' được tắt. Tôi tin rằng điều này là để cho phép mã được xây dựng trong chế độ phát hành được gỡ lỗi dễ dàng hơn.Lợi ích của tùy chọn 'Tối ưu hóa mã' trong Visual Studio build

Vì chúng tôi đang tạo phần mềm máy tính để bàn khá đơn giản kết nối với Dịch vụ Web phụ trợ, (ví dụ: không phải là ứng dụng chuyên sâu về xử lý) thì sao nếu bất kỳ loại hiệu suất nào có thể được mong đợi?

Và có bất kỳ nền tảng cụ thể nào có thể bị ảnh hưởng nặng hơn không? Ví dụ. đa bộ vi xử lý/64 bit.

+0

Tôi đã nhìn thấy sai lầm chạy này vào một _lot_ trong các cửa hàng cũ vẫn còn bị mắc kẹt với một nền văn hóa C/C++ khi họ (yêu cầu) đang cố gắng chuyển sang các công nghệ mới hơn. –

+0

@Greg D - Thú vị, tôi có thể nghĩ rằng văn hóa C++ thích tối ưu hóa hơn - hoặc đó không phải là ý của bạn? –

+1

@gt: Văn hóa C++ mà tôi đã chạy thường xuyên nhất _claims_ để thích tối ưu hóa và "mã nhanh", nhưng hầu hết các khiếu nại đó đều dựa trên mê tín dị đoan và bất hợp lý về bất kỳ điều gì mới hoặc khác biệt. Tôi không phủ nhận rằng văn hóa tôi đang đề cập đến là rối loạn chức năng, nhưng tôi nghĩ nó cũng phổ biến rộng rãi bên ngoài cửa hàng đặc biệt này.Số lượng người, mặc dù tất cả các bằng chứng ngược lại, nhấn mạnh rằng mã _their_ C++ có đặc điểm perf cao hơn đối với một số mã C# được viết hợp lý, ví dụ, là đáng kinh ngạc. Tôi đã nghe nói "Tôi sẽ tự quản lý bộ nhớ của mình, thankyouverymuch" quá thường xuyên. –

Trả lời

13

Chi tiết đầy đủ có sẵn tại http://blogs.msdn.com/jaybaz_ms/archive/2004/06/28/168314.aspx.

Tóm lại ...

Trong mã được quản lý, các jitter trong thời gian chạy không gần như tất cả các tối ưu hóa. Sự khác biệt trong IL tạo ra từ lá cờ này là khá nhỏ.

+5

Tôi không chắc tại sao báo giá lại quan trọng. Các tối ưu hóa của JITter bị ảnh hưởng bởi cờ, ngay cả khi IL được tạo ra không, vì vậy cờ sẽ có tác động đến hiệu năng. Câu hỏi ban đầu là về độ lớn của sự khác biệt đó. – phoog

2

Việc tối ưu hóa được thực hiện bởi trình biên dịch là khá thấp và không ảnh hưởng đến trải nghiệm của người dùng.

Nếu bạn muốn định lượng tối ưu hóa trên ứng dụng của mình, chỉ cần cấu hình một bản dựng không được tối ưu hóa và tối ưu hóa và so sánh kết quả.

+0

Tôi đã nhận thấy các trình gỡ rối bỏ qua các dòng khi có mặt. Điều này trong VS 2013 và 15 bằng cách này! Đôi khi tôi chỉ cần chuyển đổi nó ra tại địa phương cho các mục đích gỡ lỗi. – arviman

6

Thực tế, có sự khác biệt, đôi khi khá đáng kể. Điều gì thực sự có thể ảnh hưởng đến hiệu suất (vì nó là cái gì mà JIT không mất hoàn toàn chăm sóc):

  • không cần thiết biến địa phương (ví dụ, khung stack lớn hơn cho mỗi cuộc gọi)
  • Quá chung chung hướng dẫn điều kiện, JIT dịch chúng theo cách khá đơn giản.
  • nhánh không cần thiết (cũng không được phục vụ tốt bởi một JIT - sau khi tất cả, nó không có quá nhiều thời gian để làm tất cả những optimisations thông minh)

    Vì vậy, nếu bạn đang làm một cái gì đó số - bật tối ưu hóa . Nếu không, bạn sẽ không thấy bất kỳ sự khác biệt nào cả.

26

Bạn là người duy nhất có thể trả lời câu hỏi "hiệu suất đạt được". Hãy thử cả hai cách, đo lường hiệu suất và xem điều gì xảy ra. Các hit có thể rất lớn hoặc nó có thể không tồn tại; không ai đọc điều này biết liệu "rất lớn" với bạn có nghĩa là một micro giây hoặc hai mươi phút.

Nếu bạn quan tâm đến những gì tối ưu hóa được thực hiện bởi các biên dịch C# - chứ không phải là jitter - khi chuyển đổi tối ưu hóa được bật, xem:

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx