Đo thời gian thực hiện chức năng trong R


282

Có cách nào được chuẩn hóa trong R về thời gian thực hiện chức năng không?

Rõ ràng là tôi có thể lấy system.timetrước và sau khi thực hiện và sau đó lấy sự khác biệt của những thứ đó, nhưng tôi muốn biết liệu có cách nào đó hoặc chức năng được tiêu chuẩn hóa (muốn không phát minh ra bánh xe).


Tôi dường như nhớ rằng tôi đã từng sử dụng một cái gì đó như dưới đây:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

2
Tôi nghĩ rằng bạn đã có proc.timetrong tâm trí nguyên nhân system.timelà một trong những bạn cần.
Marek

1
Đối với các chức năng lớn hơn, Rproflà tốt đẹp. Nó cung cấp một hồ sơ của tất cả các quy trình trong một đoạn mã / hàm.
Rich Scriven

38
Người dùng R mới tìm thấy câu hỏi này thông qua google: require(microbenchmark)bây giờ (từ một vài năm trước) theo cách tiêu chuẩn cộng đồng để mọi thứ thời gian. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Điều này thực hiện so sánh thống kê so lmvới glmhơn 1000 lần thử, thay vì system.timechỉ thử nghiệm một lần.
đẳng cấu

sử dụng res <- microbenchmark(your code1,your code2)và sau đó print(res)để xem bảng hoặc ggplot2::autoplot(res)để xem boxplot! ref
Travis

Câu trả lời:


253

Một cách khác có thể làm điều này là sử dụng Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Không phải là cách thanh lịch nhất để làm điều đó, so với câu trả lời ở trên, nhưng chắc chắn là một cách để làm điều đó.


14
Đây là bộ nhớ hiệu quả hơn nhiều, sau đó system.time (), sao chép hiệu quả các đối số của nó. Điều quan trọng là khi bạn đang xử lý dữ liệu hầu như không vừa với RAM của bạn.
Adam Ryczkowski

2
Đối với những người sử dụng Sys.time, vui lòng đọc này cho một số báo trước: đang R Timing với Sys.time ()
李哲源

1
system.time()đã nhanh hơn đối với tôi. Tôi nghĩ rằng câu trả lời cho system.time()nên được chấp nhận!
Gwang-Jin Kim

Đây là cách ưa thích của tôi để biết thời gian cần thiết cho một phép tính dài được thực hiện song song trên nhiều lõi. Trong trường hợp này, thời gian đồng hồ treo tường được đo qua cuộc gọi này là đủ chính xác vì máy tính sẽ bận rộn hơn nhiều với tất cả các lõi tính toán hơn là làm bất cứ điều gì khác và việc tính toán mất vài phút hoặc vài giờ để hoàn thành. Đây là một trường hợp sử dụng rất cụ thể nhưng đáng nói.
Pablo Adames

186

Các chức năng tích hợp system.time()sẽ làm điều đó.

Sử dụng như: system.time(result <- myfunction(with, arguments))


1
Điều quan trọng cần biết là system.time()có một cuộc tranh cãi gcFirstđó là TRUEtheo mặc định. Điều này một mặt làm cho phép đo có thể lặp lại nhiều hơn một chút nhưng có thể tạo ra một chi phí đáng kể trong tổng thời gian chạy (không được đo, tất nhiên).
jakob-r

2
đơn vị này được đo bằng đơn vị nào? ví dụ tôi vừa chạy system.time(result <- myfunction(with, arguments))và nhận 187.564 làm đầu ra - đó là trong vài giây hay sao?
zsad512

Đối với những người đang sử dụng system.time, vui lòng đọc phần này để biết một số cảnh báo: Không tìm thấy đối tượng và các biểu tượng không mong đợi, lỗi khi định mã R với system.time () .
李哲源

@ zsad512 Tôi chắc chắn rằng đó là những giây .
Tapper

58

Như Andrie đã nói, system.time()hoạt động tốt. Đối với chức năng ngắn, tôi thích đặt replicate()nó vào:

system.time( replicate(10000, myfunction(with,arguments) ) )

28
Bạn nên sử dụng gói microbenchmark vì nó không bao gồm chi phí nhân rộng trong thời gian.
hadley

37

Một cách tốt hơn để đo thời gian thực hiện, là sử dụng gói rbenchmark . Gói này (dễ dàng) cho phép bạn chỉ định số lần lặp lại bài kiểm tra của mình và điểm chuẩn tương đối sẽ là bao nhiêu.

Xem thêm một câu hỏi liên quan tại stats.stackexchange


6
Microbenchmark thậm chí còn tốt hơn vì nó sử dụng các chức năng định thời chính xác cao hơn.
hadley

4
@hadley Nhưng rbenchmark thân thiện với người dùng hơn trong trường hợp so sánh. Đối với tôi microbenchmark được nâng cấp system.time. rmicrobenchmark là những gì chúng ta cần :)
Marek

3
Người duy trì microbenchmark khá nhạy - Tôi cá là anh ta sẽ thêm bất cứ thứ gì bạn cần.
hadley

34

microbenchmark là gói nhẹ (~ 50kB) và ít nhiều là một cách tiêu chuẩn trong R để đo điểm chuẩn cho nhiều biểu thức và chức năng:

microbenchmark(myfunction(with,arguments))

Ví dụ:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Ở đây cả hai biểu thức được đánh giá 10000 lần, với thời gian thực hiện trung bình là khoảng 25-30 ns.


32

Ngoài ra còn có proc.time()

Bạn có thể sử dụng theo cách tương tự Sys.timenhưng nó mang lại cho bạn một kết quả tương tự system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

sự khác biệt chính giữa việc sử dụng

system.time({ #your function here })

proc.time()phương pháp vẫn không thực hiện chức năng của mình thay vì chỉ đo thời gian ... và bằng cách này, tôi muốn sử dụng system.timevới {}bên trong, do đó bạn có thể đặt một bộ điều ...


25

Gói "tictoc" cung cấp cho bạn một cách rất đơn giản để đo thời gian thực hiện. Tài liệu có trong: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Để tiết kiệm thời gian trôi qua vào một biến bạn có thể làm:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

18

Mặc dù các giải pháp khác hữu ích cho một chức năng duy nhất, tôi khuyên bạn nên sử dụng đoạn mã sau đây chung chung và hiệu quả hơn:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

2
Tôi đã không biết về Rprof cho đến bây giờ và nó thực sự tuyệt vời! cộng với nó đi kèm với cơ sở R vì vậy không cần thiết phải gói thêm như microbenchmarkhay profvis.
Simon C.

Tôi tự hỏi nếu rprof cũng có thể được hình dung, chẳng hạn như nếu chúng ta muốn vẽ thời gian cho mỗi mục mà nó định hình?
Zawir Amin

@ZawirAmin Có một cách, chỉ cần sử dụng Rstudio >> menu hồ sơ
TPArrow

13

Một cách đơn giản nhưng rất mạnh mẽ khác để làm điều này là sử dụng gói profvis. Nó không chỉ đo thời gian thực thi mã của bạn mà cung cấp cho bạn chi tiết cho từng chức năng bạn thực hiện. Nó cũng có thể được sử dụng cho Shiny.

library(profvis)

profvis({
  #your code here
})

Nhấp chuột đây để xem một số ví dụ.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.