2011-11-01 29 views
14

Có ai có thể giới thiệu công cụ lược tả hiệu suất với hỗ trợ F # tốt không?Công cụ lược tả hiệu suất F # tốt

Tôi đã sử dụng trình thu gọn Visual Studio 2010 nhưng tôi đã tìm thấy một vài vấn đề khi sử dụng F #. Nó cảm thấy giống như tôi đang cấu hình mã byte sau khi phản chiếu hơn F # ban đầu.

Ví dụ khi profiling như sau ví dụ hơi giả tạo:

let Add a b = 
    a + b 

let Add1 = Add 1 

let rec MultiAdd count = 
    match count with 
    | 1 -> 1 
    | _ -> (Add1 1) + (MultiAdd (count - 1)) 

MultiAdd 10000 |> ignore 

tôi nhận được cuộc gọi cây sau:

CallTree

Khi tôi xem Microsoft.FSharp.Core.FSharpFunc`2. Gọi (0) trong Chi tiết Chức năng tôi thấy: Function Details

Tôi hiểu rằng những gì Tôi thấy được dựa trên việc triển khai cơ bản mã được biên dịch và mặc dù tôi có thể theo dõi nó, thật khó.

Có ai có kinh nghiệm sử dụng các công cụ lược tả khác với F # và họ có thực hiện công việc lập bản đồ tốt hơn với mã F # ban đầu không?

+0

Các bạn đã thử các tùy chọn để lấy mẫu CPU thay vì thiết bị đo đạc cho các cuộc gọi chức năng? – gradbot

Trả lời

6

Câu trả lời của tôi có thể làm bạn thất vọng, nhưng nó có thể hữu ích.

Một vài tháng trước, tôi đã cố gắng tìm một số miễn phí .NET profiler cho dự án F # của tôi. Trải nghiệm của tôi với nprof, slimtune, EQATEC và (gần đây là thương mại) Xte profiler hoàn toàn không phù hợp. Tôi tìm thấy sự hỗ trợ của họ cho F # rất hạn chế, và đã phải quay trở lại Visual Studio 2010 profiler. Tôi nghĩ rằng đặt cược tốt nhất của bạn ở đây là một số hồ sơ thương mại (mà tôi không có kinh nghiệm với).

Sau một thời gian, tôi quen với trình thu thập thông tin và xem bản trình bày kết quả dễ dàng, rõ ràng và dễ hiểu. Nếu bạn đã tối ưu hóa các chương trình song song, việc sử dụng Trình hiển thị đồng thời sẽ không thể tránh khỏi. Điều đó nói rằng điều duy nhất bạn quan tâm là hiệu suất; nhận được tốt với VS 2010 profiler là giá trị để thử.

Để lập cấu hình mã F #, tôi cũng tìm thấy CLR ProfilerILSpy đáng để đề cập. Các cựu có thể hình dung heaps trong trường hợp bạn muốn tối thiểu hóa phân bổ bộ nhớ hoặc thu gom rác thải. Sau này có thể tạo ra mã tương đương trong IL hoặc C# (mà tôi quen thuộc hơn F #); nó có thể giúp hiểu các cấu trúc bậc cao trong F # hoạt động như thế nào để sử dụng chúng một cách thích hợp.

UPDATE:

Dave Thomas đã viết an excellent blog post nơi ông sử dụng nhiều profilers thương mại để phát hiện rò rỉ bộ nhớ và điều chỉnh một ứng dụng không đồng bộ. Hãy xem những sơ lược đó; chúng có thể phù hợp với sở thích của bạn.

+2

Cảm ơn bạn đã đề cập! Vấn đề chính là ánh xạ các tên trở lại các kiểu F #, kiểm tra đánh giá của http://www.jetbrains.com/profiler/ nếu có tùy chọn 'dòng mã' cho phép bạn cấu hình xuống dòng vi phạm – 7sharp9

+0

Thực hiện bạn biết của bất kỳ công cụ sẽ làm việc trên mac? – czifro

4

Có vẻ như hồ sơ của bạn ở chế độ Gỡ lỗi. Bạn cần bật "Tối ưu hóa mã" từ dự án -> thuộc tính -> trình đơn xây dựng. Bạn cũng có thể cấu hình trong chế độ phát hành có chế độ này được bật theo mặc định. Nếu bạn không ở đó sẽ có rất nhiều cuộc gọi và tạo đối tượng Tuple trong số những thứ khác.

Hàm MultiAdd ở trên không phải là đệ quy đuôi. Nếu có, bạn cũng cần phải bật "Tạo cuộc gọi đuôi" trong chế độ Gỡ lỗi để định cấu hình.

enter image description here

này cũng sẽ là một trường hợp tốt để tối ưu hóa cuộc gọi đuôi.

let Add a b = 
    a + b 

let Add1 = Add 1 

let rec MultiAdd total count = 
    match count with 
    | 1 -> 1 + total 
    | _ -> MultiAdd (count - 1) (total + Add1 1) 

MultiAdd 10000 0 |> ignore 

enter image description here

+0

Tôi đã thử chạy nó trong chế độ phát hành và đảm bảo "Tối ưu hóa mã" được kiểm tra nhưng vẫn có kết quả tương tự. Tui bỏ lỡ điều gì vậy? –

+2

@KeithHarrison các cuộc gọi invoke sẽ không biến mất trong trường hợp này bởi vì chức năng này không phải là đệ quy đuôi. Hãy thử phiên bản cuộc gọi đuôi mà tôi đã thêm. Trình gỡ lỗi cũng có bộ lọc giảm nhiễu. Bạn có thể đặt nó để bỏ qua cuộc gọi dưới một% thời gian. – gradbot

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