Sau đây là chức năng xóa. Tôi không hiểu cách danh sách: chức năng bản đồ được sử dụng ở đây. Ai đó có thể giải thích?cách sử dụng danh sách erlang: chức năng bản đồ
% perform M runs with N calls to F in each run.
% For each of the M runs, determine the average time per call.
% Return, the average and standard deviation of these M results.
time_it(F, N, M) ->
G = fun() -> F(), ok end,
NN = lists:seq(1, N),
MM = lists:seq(1, M),
T = lists:map(
fun(_) ->
T0 = now(), % start timer
[ G() || _ <- NN ], % make N calls to F
1.0e-6*timer:now_diff(now(), T0)/N % average time per call
end,
MM
),
{ avg(T), std(T) }.
Cảm ơn.
cũng vậy, tôi không biết cú pháp đúng khi sử dụng chức năng này. Ví dụ, tôi có một hàm dummy() lấy 1 tham số. Tôi gặp lỗi khi cố gắng thời gian chức năng giả.
moduleName:time_it(moduleName:dummy/1, 10, 100).
ở trên sẽ đánh giá biểu hiện bất hợp pháp.
Trên thực tế, bây giờ với cú pháp chính xác, các chức năng có thể được gọi một cách chính xác với:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Tuy nhiên, nó sẽ ném một ngoại lệ nói cách gọi chức năng giả mà không đi bất kỳ thông số. Tôi nghĩ rằng dòng này là nhân vật phản diện, [ G() || _ <- NN ],
Tôi không có ý tưởng làm thế nào để sửa chữa nó.
gì lý do cho 'G = fun() -> F(), ok end' thay vì gọi trực tiếp' F() 'NN lần? – Zed
Đoán ban đầu của tôi là đây là một sự tối ưu hóa sai lầm để "vứt bỏ" đầu ra của F() trong trường hợp bằng cách tích lũy nó trong danh sách hiểu nó làm chậm mọi thứ xuống. Vì vậy, tôi đã thử nó và nó tạo nên sự khác biệt! Nếu F của bạn xuất hiện một cái gì đó giống như một danh sách của 255 số nguyên, sau đó chạy nó đủ thời gian là chậm hơn trong một danh sách hiểu hơn gọi G(). Có lẽ điều này là do chi phí của việc xây dựng danh sách. Sử dụng danh sách: foreach là giải pháp tốt hơn - điều này nhanh hơn nhiều so với việc hiểu danh sách và không cần phải lồng hàm. –