R cinsinden fonksiyon yürütme süresini ölçme


282

R'de işlevin yürütme süresini ölçmenin standart bir yolu var mı?

Açıkçası, system.timeçalıştırmadan önce ve sonra alabilir ve daha sonra bunların farkını alabilirim, ancak standart bir yol veya işlev olup olmadığını bilmek istiyorum (tekerleği icat etmek istemiyorum).


Bir zamanlar aşağıdaki gibi bir şey kullandığımı hatırlıyorum:

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
Bence aklınız vardı proc.timeçünkü system.timeihtiyacınız olan şey.
Marek

1
Daha büyük fonksiyonlar Rprofiçin güzel. Bir kod yığını / işlevindeki tüm işlemlerin bir profilini sağlar.
Zengin Scriven

38
Bu soruyu google üzerinden bulan yeni R kullanıcıları require(microbenchmark)(şimdi birkaç yıl önce) zaman zaman topluluğun standart yoludur. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Bu does istatistiksel karşılaştırılması lmvs glmziyade, 1000'den fazla denemeden system.timesadece bir kez test.
izomorphismes

kullanmak res <- microbenchmark(your code1,your code2)ve daha sonra print(res)bir tablo görmek veya ggplot2::autoplot(res)bir Boxplot görmek için! ref
Travis

Yanıtlar:


253

Bunu yapmanın bir başka olası yolu Sys.time () kullanmak olacaktır:

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

Yukarıdaki yanıta kıyasla bunu yapmanın en zarif yolu değil, ama kesinlikle yapmanın bir yolu.


14
Bu, argümanlarını etkili bir şekilde kopyalayan, daha verimli bellek, daha sonra system.time () 'dir. RAM'inize neredeyse hiç sığmayan verilerle uğraşırken önemlidir.
Adam Ryczkowski

2
Kullanan insanlar için Sys.time, lütfen bazı uyarılar için bunu okuyun: Sys.time ile zamanlama R kodu ()
李哲源

1
system.time()benim için daha hızlıydı. Ben o cevabı düşünmek system.time()kabul edilmelidir!
Gwang-Jin Kim

Bu, birden fazla çekirdek üzerinde paralel olarak yapılan uzun bir hesaplama için gereken süreyi bilmek için tercih ettiğim yol. Bu durumda, bu çağrı ile ölçülen duvar saati süresi yeterince doğrudur, çünkü bilgisayar tüm çekirdeklerin hesaplanmasıyla başka bir şey yapmaktan çok daha yoğun olacaktır ve hesaplamaların tamamlanması dakikalar veya saatler sürmektedir. Bu çok özel bir kullanım durumudur, ancak bahsetmeye değer.
Pablo Adames

186

Yerleşik işlev system.time()bunu yapacaktır.

Gibi kullanın: system.time(result <- myfunction(with, arguments))


1
Bilmeniz önemlidir, bunun varsayılan olarak system.time()bir argümanı gcFirstvardır TRUE. Bu, bir yandan ölçümü biraz daha tekrarlanabilir hale getirir, ancak toplam çalışma süresinde (elbette ölçülmeyen) önemli bir ek yük oluşturabilir.
jakob-r

2
bu hangi birimde ölçülür? örneğin ben sadece koştum system.time(result <- myfunction(with, arguments))ve çıktı olarak 187.564 aldım - saniyeler içinde mi yoksa ne?
zsad512


@ zsad512 Bunların saniyeler olduğundan eminim .
Tapper

58

Andrie'nin dediği gibi, iyi system.time()çalışıyor. Kısa işlev için içine koymayı tercih ederim replicate():

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

28
Mikrobenchmark paketini kullanmanız daha iyidir, çünkü zamanlamadaki çoğaltma yükünü içermez.
hadley

37

Yürütme süresini ölçmenin biraz daha güzel bir yolu, rbenchmark paketini kullanmaktır . Bu paket (kolayca), testinizi kaç kez çoğaltacağınızı belirtmenize olanak tanır ve göreceli karşılaştırmalı değerlendirme olması gerekir.

Ayrıca, stats.stackexchange adresindeki ilgili bir soruya bakın


6
Daha yüksek hassasiyetli zamanlama fonksiyonları kullandığından mikrobenç işareti daha da iyidir.
hadley

4
@hadley Ancak rbenchmark karşılaştırmalarda daha kullanıcı dostudur. Benim için mikrobenchmark yükseltildi system.time. rmicrobenchmark ihtiyacımız olan şey :)
Marek

3
Mikrobenchmark'ın koruyucusu oldukça duyarlı - bahse girerim ihtiyacınız olanı eklerdi.
hadley

34

microbenchmark hafif (~ 50kB) bir pakettir ve birden fazla ifadeyi ve işlevi karşılaştırmak için R'de az çok standart bir yoldur:

microbenchmark(myfunction(with,arguments))

Örneğin:

> 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

Burada her iki ifade 10000 kez değerlendirilmiş, ortalama uygulama süresi 25-30 ns civarındadır.


32

Ayrıca birde şu var proc.time()

Aynı şekilde kullanabilirsiniz, Sys.timeancak size benzer bir sonuç verir system.time.

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

kullanma arasındaki temel fark

system.time({ #your function here })

yani proc.time()yöntem hala işlevini yürütmek gelmez yerine sadece zaman ölçme ... ve bu arada, ben kullanmak ister system.timebirlikte {}şeylerin grubu koymak, böylece iç ...


25

"Tictoc" paketi, yürütme süresini ölçmenin çok basit bir yolunu sunar. Dokümantasyon: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

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

Geçen süreyi bir değişkene kaydetmek için şunları yapabilirsiniz:

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

18

Diğer çözümler tek bir işlev için yararlı olsa da, daha genel ve etkili olan aşağıdaki kod parçasını öneririm:

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

2
Şimdiye kadar Rprof'u bilmiyordum ve gerçekten harika! artı baz R ile birlikte gelir, bu yüzden microbenchmarkveya olarak ekstra pakete gerek yoktur profvis.
Simon

Mesela rprof'un da görselleştirilebildiğini merak ediyorum, örneğin profillendirdiği her bir öğe için zaman planlamak istiyorsak?
Zawir Amin

@ZawirAmin Bir yol var, sadece Rstudio >> profil menüsünü kullanın
TPArrow

13

Bunu yapmanın bir başka basit ama çok güçlü yolu paketi kullanmaktır profvis. Sadece kodunuzun yürütme süresini ölçmekle kalmaz, aynı zamanda yürüttüğünüz her fonksiyon için bir detaya inmenizi sağlar. Shiny için de kullanılabilir.

library(profvis)

profvis({
  #your code here
})

Bazı örnekler için burayı tıklayın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.