2009-04-15 27 views
10

Tôi đang viết một ứng dụng DSP trong C# (về cơ bản là một trình soạn thảo đa nhiệm). Tôi đã được profiling nó cho một số thời gian trên các máy khác nhau và tôi đã nhận thấy một số điều 'tò mò'.Buộc trình biên dịch .NET JIT tạo mã tối ưu nhất trong khi khởi động ứng dụng

Trên máy chủ, lần chạy đầu tiên của vòng lặp phát lại chiếm khoảng 50% -60% thời gian có sẵn, (tôi cho rằng đó là do JIT thực hiện công việc của mình), sau đó cho các vòng lặp tiếp theo đến mức tiêu thụ ổn định 5%. Vấn đề là, nếu tôi chạy ứng dụng trên máy tính chậm hơn, lần chạy đầu tiên chiếm nhiều thời gian hơn, khiến cho quá trình phát lại bị gián đoạn và làm rối loạn âm thanh đầu ra, điều này là không thể chấp nhận được. Sau đó, nó giảm xuống mức tiêu thụ 8% -10%.

Ngay cả sau lần chạy đầu tiên, ứng dụng luôn gọi một số thói quen tốn thời gian (mỗi 2 giây trở lên), khiến mức tiêu thụ 5% ổn định trải qua các đỉnh rất ngắn 20% -25% . Tôi đã nhận thấy rằng nếu tôi để ứng dụng chạy trong một thời gian thì các đỉnh này cũng sẽ giảm xuống 7% -10%. (Tôi không chắc liệu đó là do JIT biên dịch lại các phần mã này).

Vì vậy, tôi gặp sự cố nghiêm trọng với JIT. Mặc dù ứng dụng sẽ hoạt động tốt ngay cả trong các máy rất chậm, những 'cơn bão biên dịch' này sẽ là một vấn đề lớn. Tôi đang cố gắng tìm ra cách giải quyết vấn đề này và tôi đã đưa ra một ý tưởng, đó là đánh dấu tất cả các thói quen 'hợp lý' với một thuộc tính sẽ cho ứng dụng biết 'ép' chúng trước khi khởi động , do đó, chúng sẽ được tối ưu hóa hoàn toàn khi chúng thực sự cần thiết. Nhưng đây chỉ là một ý tưởng (và tôi không thích nó quá nhiều) hoặc tôi tự hỏi nếu có một giải pháp tốt hơn cho toàn bộ vấn đề.

Tôi muốn nghe ý kiến ​​của các bạn.

(NGEN các ứng dụng không phải là một lựa chọn, tôi thích và muốn tất cả các tối ưu hóa JIT tôi có thể nhận được.)

EDIT:

tiêu thụ bộ nhớ và thu gom rác thải đá không phải là một vấn đề, tôi sử dụng các nhóm đối tượng và đỉnh cao nhất của bộ nhớ trong khi phát lại là 304 Kb.

+1

Nó sẽ giúp nếu bạn nói ** tại sao ** NGEN không phải là một lựa chọn; hiểu vấn đề là một nửa công việc ... –

+0

Tối ưu hóa JIT nào không có sẵn khi NGen-ing? – Will

+0

@Marc: Tôi muốn NGen là ứng dụng cuối cùng, nhưng tôi không muốn sử dụng nó nếu có giải pháp tốt hơn. – Trap

Trả lời

16

Bạn có thể kích hoạt các trình biên dịch JIT để biên dịch toàn bộ tập hợp của bạn trong suốt quá trình khởi tạo ứng dụng của bạn bằng cách sử dụng phương thức PrepareMethod ... (mà không cần phải sử dụng NGen).

Giải pháp này được mô tả chi tiết hơn tại đây: Forcing JIT Compilation During Runtime.

4

Tốc độ ban đầu thực sự giống như Fusion + JIT, được ILMerge (cho Fusion) và NGEN (cho JIT) trợ giúp; bạn luôn có thể chơi một bản nhạc im lặng thông qua hệ thống lúc khởi động để điều này có làm mọi công việc khó khăn mà không có người dùng nhận thấy bất kỳ sự biến dạng nào không?

NGEN là một lựa chọn tốt; có lý do bạn không thể sử dụng không?

Các vấn đề bạn đề cập đến sau tải ban đầu làm không phải là âm thanh như chúng liên quan đến JIT. Có lẽ thu gom rác.

Bạn đã thử định hình chưa? Cả CPU và bộ nhớ (bộ sưu tập)?

+0

Đối với tôi, lý do duy nhất không sử dụng ngen là yêu cầu quyền quản trị trong khi cài đặt, do đó không thể áp dụng cho các cài đặt cho mỗi người dùng trên mạng công ty. Có lẽ đó cũng là lý do cho OP? –

+0

Tại sao không làm NGEN như một tùy chọn khi cài đặt? Vì vậy, nếu bạn có quyền quản trị, hãy làm điều đó. Nếu không cảnh báo người dùng và không làm điều đó. –

3

Như Marc đã đề cập, các đột biến liên tục không giống như các vấn đề JIT. Những thứ khác cần tìm kiếm:

  • Thu gom rác - bạn có cấp phát bộ nhớ trong quá trình xử lý âm thanh không? Nếu bạn đang tạo ra rất nhiều rác, hoặc thậm chí cả các đối tượng tồn tại trong bộ sưu tập Gen 0, điều này có thể gây ra những đột biến đáng chú ý. Nghe có vẻ như bạn đang làm một số loại tiền phân bổ, nhưng xem ra cho phân bổ ẩn trong mã thư viện (thậm chí một vòng lặp foreach có thể phân bổ!)

  • Denormals. Có một vấn đề với một số loại vi xử lý nhất định khi xử lý các số dấu phẩy động rất nhỏ có thể gây ra các xung đột biến CPU. Xem http://www.musicdsp.org/files/denormal.pdf để biết chi tiết.

Edit:

Thậm chí nếu bạn không muốn sử dụng NGen, ít nhất là so sánh một phiên bản NGen'd để bạn có thể xem những gì JITing khác biệt làm cho

+1

Thú vị. Tôi không có manh mối nào rằng những kẻ biến thái là một cú va chạm khổng lồ. –

2

Nếu bạn tin rằng bạn đang bị ảnh hưởng bởi JIT, thì hãy biên dịch trước ứng dụng của bạn bằng NGEN và chạy thử lại. Không có phí JIT trong mã được NGEN biên dịch. Nếu bạn vẫn nhìn thấy gai trong ứng dụng NGEN'd, thì bạn biết chúng không phải do JIT gây ra.

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