2012-06-29 73 views
8

Khi sử dụng trình lược tả trong Visual Studio để theo dõi các hàm đắt tiền, tôi đã thấy nhân dịp phần lớn công việc kết thúc bằng [clr.dll] . Về cơ bản số tiền đó là một hộp đen, và tôi tự hỏi nếu có một cách để theo dõi lý do tại sao nó dành quá nhiều thời gian ở đó. Tôi giả định rằng clr.dll xử lý các công cụ như biên dịch JIT, tải assembly và quản lý appdomain, thu gom rác, phản xạ, vv Nhưng nó làm cho nó thực sự khó khăn để thực sự cho biết mã nào làm cho nó tốn quá nhiều thời gian.Visual Studio profiler, cách theo dõi sử dụng [clr.dll]

Rõ ràng đó là một số mã khác ngoài thời gian chạy chính nó gây ra nó để dành nhiều thời gian trong clr.dll, vậy làm thế nào để bạn theo dõi những gì mã có lỗi?

Trả lời

1

Bạn cần biết phần nào của mã - mã bạn có thể chỉnh sửa và biên dịch, là mã duy nhất bạn có thể sửa - phần nào của mã đó chịu trách nhiệm cho một phần lớn thời gian được sử dụng.

Không nên biết rằng clr.dll đang sử dụng nhiều thời gian trừ khi bạn có thể cho biết phần nào của mã của bạn chịu trách nhiệm về nó.

Thông tin đó nằm trong ngăn xếp cuộc gọi.

Nếu bạn có một phương pháp, hoặc thậm chí một dòng mã, đó là trên stack cho một số phần trăm thời gian, chẳng hạn như 20%, sau đó nó chịu trách nhiệm cho khoảng thời gian đó. Nếu bạn bằng cách nào đó có thể loại bỏ dòng mã đó (hoặc mất ít thời gian hơn) 20% tổng thời gian sẽ trở thành 0 hoặc gần như vậy, cho bạn hệ số tăng tốc 1.0/0.8 = 1.25 hoặc 25 %

Vậy làm cách nào bạn tìm thấy các dòng như vậy? This is the method I use. Không ai tuyên bố nó là đẹp, trừ khi tổng số kết quả được đánh giá cao. Nếu được áp dụng nhiều lần, large speedup factors are possible.

+0

Đối với bất kỳ thứ gì được quản lý mã, nó thực sự là một công việc tốt để theo dõi toàn bộ ngăn xếp cuộc gọi, chỉ khi nó được đưa vào mã gốc mà nó mất theo dõi chức năng nào chịu trách nhiệm. Vì vậy, tạm dừng nó kiểm tra ngăn xếp cuộc gọi bằng tay có vẻ như nó sẽ cho kết quả hữu ích hơn. –

+0

@Bryce: 1) Có, nhưng tôi cho rằng mã của bạn là mã được quản lý (trừ khi nó không phải là), và nếu có điều gì đó bạn có thể sửa, nó nằm trong * mã của bạn *. 2) Trình thu thập thông tin thu thập thông tin ngăn xếp, nhưng vấn đề là thay vì cho phép bạn xem những gì các mẫu ngăn xếp đang nói, chúng tóm tắt thành các cây gọi và không có gì. Điều đó làm mất thông tin bạn cần: sự hiểu biết đầy đủ về những gì chính xác đang xảy ra trong các mẫu cụ thể, không phải trong tổng hợp. –

1

Dựa trên kinh nghiệm của tôi, có thể là trong GC. Nếu bạn sử dụng LINQ, nó gần như chắc chắn trong GC. Tôi khuyên bạn nên CLRProfiler để theo dõi thư rác Gen 0.

+0

Nên là câu trả lời tốt nhất, cho đến nay. Trong câu hỏi ban đầu, ông rõ ràng đã nhìn vào dòng mã profiler và ngăn xếp. – Celess

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