2010-07-12 39 views
12

F # tương tác (và trong các công cụ phong cách REPL nói chung) là một lối vào lý tưởng để lược tả hiệu suất. Điều gì có thể dễ dàng hơn để chọn một khối mã và gửi nó ngay đến một hồ sơ mà sẽ trở lại với báo cáo phân tích hiệu suất. Thật không may, có vẻ như các trình lược tả hiện tại không có hỗ trợ REPL: bạn phải đính kèm một trình lược tả vào một quy trình hoặc chỉ định và thực thi hoặc ứng dụng Web cho cấu hình.F # tương tác và hiệu suất profilers

Điều tôi làm sau đó là gói một khối mã vào cấu hình trong một bài kiểm tra đơn vị và sau đó thực thi một cấu hình chống lại phiên dòng lệnh NUnit. Nhưng đây có phải là điều tốt nhất chúng ta có thể làm ngay bây giờ với F #?

+0

Tôi đã đăng câu hỏi trong diễn đàn RedGate ANTS Profiler và họ cho biết họ thích ý tưởng và sẽ xem xét ý tưởng đó. –

+0

Có một cách khác để suy nghĩ về hồ sơ - không phải là đo thời gian và đếm cuộc gọi, nhưng khi hỏi "Cái quái gì đang làm?" - http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

Trả lời

9

Câu hỏi là gì?

Bạn có biết về lệnh #time không? Ví dụ.

#time "on" 
for i in 1..1000000 do 
    let r = f(i) 
    ignore r 

mang đến cho F # đầu ra tương tác như

--> Timing now on 
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0 

Trong mọi trường hợp, tôi nghĩ đơn giản là đặt mã trong một ứng dụng và chạy hồ sơ cá nhân chống lại các ứng dụng là tốt hơn so với một bài kiểm tra NUnit. Dù bằng cách nào, có, nó chi phí bạn có thể thêm 30 giây thời gian để dán mã vào một ứng dụng mới và biên dịch nó trong chế độ phát hành. Nhưng đó là một mức giá tôi rất vui khi được trả tiền để có được thông tin định dạng phong phú mà Visual Studio cung cấp. Lý tưởng nhất là trải nghiệm có thể tốt hơn, nhưng tôi nghi ngờ bạn sẽ tìm thấy bất kỳ công cụ lược tả thân thiện với REPL nào hôm nay (hoặc ngày mai).

+0

Có, nhưng điều này chỉ hữu ích trong các trường hợp đơn giản. Nó không cung cấp cho bạn một hình ảnh về cách thời gian thực hiện được phân chia giữa các hoạt động trong ngăn xếp cuộc gọi. –

+0

Và để trả lời câu hỏi của bạn "câu hỏi là gì?": Câu hỏi không phải là về việc thực hiện thời gian của cuộc gọi bên ngoài. Câu hỏi đặt ra là về lược tả hiệu suất nhiều hơn thế: đó là một phân tích hiệu suất mở rộng dựa trên dữ liệu hiệu suất được thu thập.Các trình diễn hiện đại như dotTrace và ANTS có thể thực hiện nó bằng cách gắn vào một tiến trình hoặc chạy một ứng dụng, nhưng nó sẽ rất hiệu quả nếu chúng có thể cấu hình mã được gửi tới F # Interactive. Vì vậy, câu hỏi là liệu điều này có thể đạt được hay không. –

+0

Tôi không biết về lệnh #time! –

4

Bạn có thể thử sử dụng API lập trình profiler để đạt được điều này. Tôi đã không cố gắng này, nhưng đây là những hướng dẫn cho ANTS profiler: http://help.red-gate.com/help/ANTSProfiler3/0/en/Topics/AP_UsingTheAPI.html

Tôi nghĩ rằng sau đây có thể thành công:

  1. Bắt đầu ANTS profiler và đính kèm để fsi.exe
  2. r "RedGate. Profiler.Api.dll" trong FSI

  3. Rắc mã bạn muốn cấu với RedGate.Profiler.Api.Reset()/RedGate.Profiler.Api.TakeSnapshot()

DotTrace có (có?) API tương tự (CPUProfiler.Start() /. StopAndTakeSnapshot()), nhưng tôi không thể tìm thấy tài liệu tham khảo cho các phiên bản mới nhất.

+0

Đó là một lựa chọn thú vị! Cảm ơn vì đã cho tôi biết. Tôi sẽ thử nó. –

1

Nhưng đây có phải là điều tốt nhất chúng tôi có thể làm ngay bây giờ với F # không?

AFAIK, vâng. Đây là một ý tưởng tuyệt vời cho một tính năng trong phiên bản tiếp theo của F # hoặc sản phẩm của bên thứ ba mặc dù!

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