2011-11-01 23 views
7

Có cách nào dễ dàng JIT-ing mã C# lên phía trước, thay vì chờ đợi lần đầu tiên mã được gọi không? Tôi đã đọc về NGEN nhưng tôi không nghĩ rằng điều đó sẽ giúp tôi. Ứng dụng của tôi chờ và phản hồi sự kiện bên ngoài cụ thể đến từ cổng UDP và không có mã đường dẫn quan trọng nào (a) chạy trước khi sự kiện đến hoặc (b) chạy lại, vì vậy chi phí của JIT cao trong kịch bản này. Kiểm tra với ANTS profiler chi phí cho JIT là khoảng 40-50%, đôi khi nó cao tới 90%. Ứng dụng của tôi nhạy cảm với độ trễ cao và mỗi mili giây đều tính. Ý tưởng ban đầu của tôi là tôi có thể thêm tham số bool vào mọi phương thức đường dẫn quan trọng và gọi những phương thức đó trước khi sự kiện xảy ra, để bắt đầu biên dịch JIT. Tuy nhiên, có cách nào đẹp hơn và ít hacky hơn không?Tránh C# JIT trên không

Rất cám ơn

+10

Tại sao NGEN không giúp bạn? –

+2

Bạn đã xác định rằng nó có phải là một vấn đề không? Hay bạn chỉ nghĩ nó có thể là? –

+0

Tôi (hầu như) chắc chắn đó là vấn đề Henk. Tôi chỉ thực hiện trên một phương pháp duy nhất phương pháp hacky của tôi và chi phí JIT cho phương pháp đó trong hồ sơ ANTS đã biến mất. – endian

Trả lời

5

Tôi muốn sử dụng NGEN và nếu nó không hoạt động, bạn có thể gặp vấn đề sâu hơn.

Nhưng, để trả lời câu hỏi của bạn, bài viết này về cách pre-jit sử dụng System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod để buộc JIT. Nó bao gồm mã mẫu để sử dụng sự phản chiếu để có được các phương pháp xử lý.

+2

Tuyệt vời, cảm ơn. Tôi cũng đã tìm thấy một bài viết CodeProject (!) Kết thúc tốt đẹp các cuộc gọi PrepareMethod cho toàn bộ các kiểu. Liên kết tại đây: http://www.codeproject.com/KB/dotnet/Jitting.aspx. – endian

3

Điều gì xảy ra lần thứ hai sự kiện đến? Nó nhanh hơn hay chậm. Nếu nó vẫn còn chậm thì JIT không phải là vấn đề, bởi vì mã được "JIT" ed chỉ một lần, lần đầu tiên nó được chạy.

NGEN sẽ cung cấp câu trả lời cho bạn. Đề xuất của tôi là lấy tối thiểu mã bạn cần, con đường quan trọng nếu bạn muốn, và đặt nó vào dự án giả/sandbox. Bắt đầu lược tả/NGENning mã này và xem hiệu suất.

Nếu mã tối thiểu này, ngay cả sau khi NGEN'ed hoạt động kém trên nhiều cuộc gọi, thì việc biên dịch trước sẽ không giúp ích gì cho bạn. Một cái gì đó khác của nó trong mã đó là gây ra cổ chai hiệu suất.

+0

Mã nhanh như chớp sau sự kiện đầu tiên.Như tôi đã đề cập ở trên, tôi đã xác định rằng đó chắc chắn là phí tổn JIT gây ra các vấn đề hiệu suất. Tôi đang trong quá trình thêm một tải các cuộc gọi đến RuntimeHelpers.PrepareMethod, hy vọng rằng sẽ loại bỏ vấn đề này. – endian