2009-03-16 42 views
8

Tôi muốn biết thông tin này để giảm kích thước mã của tôi vì vậy tôi sẽ không lãng phí thời gian của tôi tối ưu hóa những thứ sẽ được thực hiện bởi trình biên dịch hoặc JIT.Ở mức độ nào trình biên dịch C# hoặc JIT tối ưu hóa mã ứng dụng?

ví dụ:

nếu chúng ta giả định trình biên dịch nội tuyến các cuộc gọi đến chức năng get của một tài sản vì vậy tôi không có để lưu các giá trị trả về trong một biến địa phương để tránh chức năng cuộc gọi.

Tôi muốn giới thiệu một tham chiếu tốt mô tả những gì đang diễn ra?

Trả lời

18

Bạn có thể muốn xem xét những bài viết này:

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

Thành thật mà bạn không nên lo lắng quá nhiều về mức độ vi cụ thể. Hãy để trình biên dịch/JIT'er lo lắng về điều này cho bạn, nó tốt hơn ở đó hơn bạn đang ở trong hầu như tất cả các trường hợp. Đừng bị treo trên Premature Optimisation.Tập trung vào việc làm cho mã của bạn hoạt động, sau đó lo lắng về việc tối ưu hóa sau này nếu (a) nó không chạy đủ nhanh, (b) bạn có vấn đề về kích thước.

17

Nếu bạn lo lắng về hiệu suất, hãy chạy một hồ sơ. Sau đó, mã thay đổi. Cơ hội là bạn sẽ không bao giờ trong một triệu năm đoán chính xác 100% thời gian. Bạn có thể thay đổi thời gian 0,02%, và để lại phương pháp đóng góp 62% gánh nặng. Bạn cũng có thể làm cho nó tồi tệ hơn. Nếu không có một hồ sơ và bằng chứng, bạn bị mù.


Bạn không có thể giả định rằng JIT sẽ inline một getter tài sản. Có nhiều lý do có thể hoặc không thể làm như vậy; kích thước của thân phương thức, giá trị ảo, giá trị so với loại tham chiếu, kiến ​​trúc, trình gỡ lỗi đính kèm, v.v.

"Hoisting" vẫn có vị trí, và vẫn có thể tiết kiệm được một lần trong vòng lặp chặt chẽ; ví dụ:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(quên for vs foreach cuộc tranh luận fr trên - đây là một cuộc thảo luận trực giao). Ở trên, "Palăng" sẽ giúp hiệu suất. Nhưng chỉ để được thực sự khó hiểu - với mảng, nó là đối diện, và nó là hiệu quả hơn để không Palăng nó:

for(int i = 0 ; i < arr.Length ; i++) {...} 

Các JIT nhận này và loại bỏ việc kiểm tra giới hạn (như mảng được cố định kích thước).

+0

Tôi không biết về điều cuối cùng! Rất vui được biết, cảm ơn! – Groo

+0

Cảm ơn thông tin, nhưng tôi hỏi về một tài liệu tham khảo tốt cho thông tin này –

+2

Quan điểm của tôi là tham chiếu * no * sẽ thực sự giúp bạn với điều này. Một ** profiler ** sẽ. –

1

Điều này trông giống như một loại tối ưu hóa vi mô mà bạn không nên xem. Nếu tôi không nhầm nó phụ thuộc vào kiến ​​trúc và phiên bản của CLR mà loại tối ưu hóa được áp dụng.

Nếu phương pháp của bạn được gọi nhiều, và bạn thực sự muốn nội tuyến, bạn có thể tự in nội tuyến theo chi phí của mã spaghetti.

Tôi khuyên bạn nên phân tích thuật toán của mình, để nội tuyến một phương pháp sẽ không lưu được tốc độ của tốc độ, trong khi thuật toán tốt hơn có thể làm cho thời gian chạy của bạn giảm từ vài giờ xuống giây.

-1

Tối ưu hóa mạnh mẽ nhất được thực hiện bởi JIT thường là nội tuyến. Một JIT thậm chí có thể nội tuyến hàng trăm chức năng sâu (tôi nghe con số này cho JikesRVM). Họ thậm chí sẽ nội tuyến những thứ mà không phải luôn luôn có thể nội tuyến, và sau đó nó ra sau nếu họ cần (gọi là năng động deoptimization).

Tổng quan đẹp là http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Đối với câu hỏi cụ thể của bạn, tôi có thể nói có thể, nếu cuộc gọi chức năng được đề cập là hot.

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