2010-06-14 36 views
40

Tôi biết tôi có thể dành thời gian để đánh giá một chức năng có thể được in ra trên màn hình/stdout bằng chức năng thời gian/macro.Làm cách nào để đánh giá các hàm trong Clojure?

Macro thời gian trả về giá trị của hàm được đánh giá, làm cho nó trở nên tuyệt vời để sử dụng nội tuyến. Tuy nhiên, tôi muốn tự động đo thời gian chạy trong những trường hợp cụ thể.

Có chức năng trả về thời gian đã trôi qua trong một số thư viện để trợ giúp cho điểm chuẩn này không?

+0

bản sao có thể có của [Công cụ lược tả cho Clojure?] (Http://stackoverflow.com/questions/2974916/profiling-tool-for-clojure) –

+0

Tôi không nghĩ vậy, câu hỏi được nhắc đến là về điểm chuẩn bên ngoài, câu hỏi này là nhiều hơn về việc thiết lập mã. Tôi phải thừa nhận ngạc nhiên rằng ai đó đang tìm kiếm bản sao trong câu hỏi 5 năm tuổi. –

Trả lời

27

Bạn có thể muốn xem thư viện điểm chuẩn của Hugo Duncan cho Clojure - Criterium.

Từ README:

biện pháp criterium thời gian tính toán của một biểu thức. Nó được thiết kế để giải quyết một số cạm bẫy của điểm chuẩn, và điểm chuẩn trên JVM nói riêng.

này bao gồm:

  • xử lý thống kê của nhiều đánh giá
  • bao gồm của một giai đoạn khởi động, được thiết kế để cho phép trình biên dịch JIT để tối ưu hóa mã của nó
  • tẩy của gc trước khi thử nghiệm, để cô lập thời gian từ trạng thái GC trước khi thử nghiệm
  • GC cưỡng bức cuối cùng sau khi thử nghiệm để ước tính tác động của việc dọn dẹp trên kết quả thời gian
30

Nếu đó chỉ là vấn đề muốn nắm bắt chuỗi theo lập trình, bạn có thể liên kết * ra * với mục khác trước khi sử dụng thời gian.

user=> (def x (with-out-str (time (+ 2 2)))) 
#'user/x 
user=> x 
"\"Elapsed time: 0.119 msecs\"\n" 

Nếu bạn muốn kiểm soát nhiều hơn định dạng, sau đó bạn có thể tạo ra phiên bản của riêng bạn thời gian sử dụng phương pháp thời gian hệ thống Java, mà là những gì thời gian sử dụng vĩ mô dưới mui xe anyway:

user => (macroexpand '(time (+ 2 2))) 
(let* [start__4197__auto__ (. java.lang.System (clojure.core/nanoTime)) 
     ret__4198__auto__ (+ 2 2)] 
    (clojure.core/prn (clojure.core/str "Elapsed time: " (clojure.core//  
      (clojure.core/double 
       (clojure.core/- (. java.lang.System (clojure.core/nanoTime)) 
           start__4197__auto__)) 1000000.0) " msecs")) 
ret__4198__auto__) 

Lấy cấu trúc cơ bản đó và thay thế cuộc gọi thành prn bằng bất kỳ cơ chế báo cáo nào bạn muốn.

+4

+1 để sử dụng macroexpand để đào dưới mui xe! – mikera

+1

Cảm ơn, tôi đã xem xét điều này để bắt đầu từ quá. Thư viện tiêu chí thực sự phù hợp với dự luật. Nhưng trừ khi bạn biết thư viện Haskell bạn sẽ không tình cờ gặp phải nó bằng cách sử dụng google. –

+1

@PeterTillemans Vâng, _now_ chúng tôi, cho rằng nó được đề cập trong StackOverflow. :-) –

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