2008-09-19 29 views
13

Tôi đã tự hỏi nếu có bất kỳ cách nào để thay đổi hành vi của trình biên dịch .NET JIT, bằng cách chỉ định một tùy chọn để tối ưu hóa sâu hơn. Nếu không, sẽ tốt hơn nếu nó có thể thực hiện một số loại tối ưu hóa hướng dẫn profile, nếu nó chưa được.Có cách nào để thay đổi trình biên dịch .NET JIT để ưu tiên hiệu năng qua thời gian biên dịch không?

Trả lời

19

Cài đặt này được thiết lập khi bạn biên dịch hội đồng của mình. Có hai loại tối ưu:

  • tối ưu hóa IL
  • JIT Native Code chất lượng.

Cài đặt mặc định là này

/optimize- /debug- 

Điều này có nghĩa unoptimized IL, và tối ưu hóa mã nguồn gốc.

/optimize /debug(+/full/pdbonly) 

Điều này có nghĩa là chưa được tối ưu hóa IL và mã gốc không được tối ưu hóa (cài đặt gỡ lỗi tốt nhất).

Cuối cùng, để có được hiệu suất nhanh nhất:

/optimize+ /debug(-/+/full/pdbonly) 

này tạo ra được tối ưu hóa IL và tối ưu hóa mã nguồn gốc.

Khi sản xuất IL chưa được tối ưu hóa, trình biên dịch sẽ chèn hướng dẫn NOP trên mã. Điều này làm cho mã dễ dàng hơn để gỡ lỗi bằng cách cho phép các điểm ngắt được đặt trên các hướng dẫn luồng điều khiển như, trong khi, nếu khác, hãy thử, bắt, v.v.

CLR thực hiện tốt công việc tối ưu hóa mã bất kể. Khi một phương thức được JIT'ed, con trỏ trên một cuộc gọi hoặc một lệnh callvirt được trỏ trực tiếp đến mã gốc.

Ngoài ra, CLR sẽ tận dụng mọi thủ thuật kiến ​​trúc có sẵn khi JIT'ing mã của bạn. Điều này có nghĩa là một assembly chạy qua JIT sẽ chạy nhanh hơn một assembly được biên dịch trước bằng cách sử dụng Ngen (mặc dù thời gian khởi động hơi chậm), vì NGen sẽ biên dịch cho tất cả các nền tảng và không tận dụng mọi thủ thuật.

+3

+1 Tốt. Trường hợp chính xác trong IDE bạn thiết lập các giá trị này? – Trap

+1

Trong VS2010 (và các phiên bản cũ hơn IIRC), hãy bật cài đặt dự án "Tối ưu hóa mã", được bật theo mặc định trong cấu hình Phát hành. (Điều này tương đương với '/ optimization', tương đương với'/optimization + '.) Lưu ý rằng trình tối ưu hóa là [xa hoàn hảo] (http://stackoverflow.com/questions/10369421/why-does-adding-local -variables-make-net-code-slow). –

+1

Không có thủ thuật cho mỗi máy, AFAIK. Tôi đã được thông báo rằng nhóm .NET cảm thấy rằng việc duy trì nhiều phiên bản của trình tối ưu hóa JIT (mà là một con thú VERY phức tạp) là quá tốn kém so với lợi ích tiềm năng. –

Các vấn đề liên quan