2010-02-03 21 views
23

Theo SICP section 1.2.6, tập thể dục 1.22:Có tương đương với nguyên tắc "thời gian chạy" của Lisp trong Đề án không?

Hầu hết các hiện thực Lisp bao gồm gọi runtime nguyên thủy mà trả về một số nguyên xác định số lượng thời gian hệ thống đã được chạy (đo, ví dụ, trong micro).

Tôi đang sử dụng DrScheme, nơi thời gian chạy dường như không khả dụng, vì vậy tôi đang tìm kiếm một sự thay thế tốt. Tôi đã tìm thấy trong Tham chiếu PLT-Đề án có một nguyên thủy current-milliseconds. Có ai biết nếu có một bộ đếm thời gian trong Đề án với độ phân giải tốt hơn?

+0

Tôi vừa bắt gặp chính xác vấn đề này :) –

+0

Thú vị mà tôi đang sử dụng Bill blog của Lizard để kiểm tra của tôi câu trả lời khi tôi trải qua SICP 4 năm sau khi anh ấy trải qua nó. Bạn có thấy điều này xảy ra khi bạn hỏi câu hỏi này không, ông Lizard? –

+0

Dưới đây là một ý chính với một 'kiểm tra thời gian nguyên tố' thay thế hoạt động trong 'vợt': https://gist.github.com/Isaac-Kleinman/1b623bc2463b241b4383 –

Trả lời

20

current-milliseconds là hàm trả về số mili giây hiện tại từ hệ thống, nhưng nó có thể giảm. current-inexact-milliseconds tương tự, nhưng trả lại số dấu phẩy động được đảm bảo.

Ngoài ra còn có một loạt các chức năng tương tự mà bạn có thể tìm thấy trên trang đó, nhưng nếu tất cả bạn cần là thời gian một chức năng nhất định, sau đó chỉ cần sử dụng (timeexpr) và nó sẽ in ra thời gian nó mất để đánh giá biểu thức.

Một điều khác có liên quan ở đây là profiler, trong trường hợp bạn cần phân tích chi tiết hơn về mã của mình.

+4

Điều đó sai. Đầu tiên, không có mối quan hệ trực tiếp giữa SICP và PLT. Thứ hai, bộ đếm mili giây đến từ hệ điều hành, và vì các trình xử lý ngắt được xử lý ở mức một vài phần nghìn giây, không có điểm nào trong một bộ đếm tốt hơn. Độ chi tiết thường ở ~ 20ms, thậm chí không 1ms. Nếu bạn có một số ngôn ngữ với, ví dụ, một truy cập nano giây, bạn sẽ không nhận được bất kỳ kết quả tốt hơn. Thứ ba, đo thời gian chạy ở cấp độ msec là một ý tưởng tồi, bạn cần phải lặp lại đánh giá đủ lần để có được một số lượng đáng kể, nếu không thời gian chạy sẽ bị mất trong tiếng ồn. –

+0

Đó là 'hiện tại-mili giây', không phải' hiện tại-mili giây'. Tôi đã cố gắng chỉnh sửa câu trả lời nhưng SO yêu cầu tối thiểu 6 ký tự trong bản chỉnh sửa. –

+0

Tôi đã sửa nó ... –

3

Tôi cũng đã gặp vấn đề này ngay hôm nay. Tôi đang sử dụng DrRacket, vì nó dường như đã thay thế DrScheme. Mặc dù đây là một chủ đề cũ, tôi đang thêm các phát hiện của mình cho bất kỳ ai mới tình cờ gặp chủ đề này.

Với R5RS như ngôn ngữ được chọn, thêm sau hai dòng trước khi chương trình để làm cho nó hoạt

(#%require (only racket/base current-milliseconds)) 
(define (runtime) (current-milliseconds)) 
+0

Bạn có thể cho biết chính xác chuỗi '#lang ... 'không? '#lang R5RS' không hoạt động. – Zelphir

+0

Ok, tôi chỉ cần thêm một nhánh "else" vào 'if' chưa đầy đủ của mã của cuốn sách, để nó chạy trong' #lang racket'. – Zelphir

+0

@ Zelphir: Tôi thường chỉ chọn "R5RS" từ dưới cùng bên trái dưới dạng ngôn ngữ trong DrRacket. Nó làm việc cho tôi trở lại sau đó. – kaustubh

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