system.time() i proc.time()
Mierz czas rzeczywisty, czas użytkownika i czas systemowy wykonywania wyrażeń R.
system.time() i proc.time() to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Dlaczego mierzyć wydajność?
Przed optymalizacją kodu należy go zmierzyć. Zgadywanie, gdzie występuje spowolnienie, prowadzi do marnowania czasu i wysiłku. R udostępnia wbudowane narzędzia do precyzyjnego pomiaru czasu wykonywania wyrażeń.
Trzy główne narzędzia to system.time(), proc.time() i Sys.time(). Każde z nich służy do innego celu w analizie wydajności.
Podstawy system.time()
system.time(expr) oblicza wyrażenie i zwraca czas jego wykonania. Jest to najprostszy sposób pomiaru czasu pojedynczej operacji w R.
Wynikiem jest obiekt klasy proc_time z nazwanymi elementami, które można sprawdzać.
result <- system.time({
x <- 1:1000000
total <- sum(x)
})
print(result)Odczytywanie trzech wartości czasu
system.time() zwraca pięć wartości, ale najważniejsze są trzy:
- user — czas procesora wykorzystany przez sam kod R
- sys — czas procesora wykorzystany przez system operacyjny na rzecz R
- elapsed — czas zegarowy, czyli rzeczywista liczba sekund, która upłynęła
Zazwyczaj najważniejsza jest wartość elapsed. Suma user + sys może przekraczać wartość elapsed na komputerach wielordzeniowych.
t <- system.time(Sys.sleep(0.1))
cat('user :', t['user.self'], '
')
cat('sys :', t['sys.self'], '
')
cat('elapsed:', t['elapsed'], '
')proc.time() do ręcznego pomiaru czasu
proc.time() zwraca migawkę bieżącego czasu procesora i czasu zegarowego. Rejestrując wynik przed blokiem kodu i po nim, można zmierzyć czas wykonania dowolnego fragmentu kodu.
Odjęcie migawki początkowej od końcowej pozwala uzyskać czas zegarowy wykonania danej sekcji.
start <- proc.time()
for (i in 1:100000) sqrt(i)
end <- proc.time()
diff <- end - start
cat('elapsed:', diff['elapsed'], 'seconds
')Składowe proc.time()
proc.time() zwraca nazwany wektor liczbowy z trzema elementami:
user.self— czas procesora użytkownika dla procesu Rsys.self— czas procesora systemu dla procesu Relapsed— czas zegarowy, który upłynął od uruchomienia R
Różnica między dwoma wywołaniami proc.time() daje miarodajną zmianę czasu.
pt <- proc.time()
cat('Names:', names(pt), '
')
cat('Values:', pt, '
')
cat('Class:', class(pt), '
')Sys.time() do znaczników czasu zegarowego
Sys.time() zwraca bieżącą datę i godzinę jako obiekt POSIXct. W przeciwieństwie do proc.time() zwraca rzeczywisty znacznik czasu, a nie tylko informacje o wykorzystaniu procesora.
Jest to przydatne do rejestrowania, kiedy coś się wydarzyło, a nie tylko jak długo trwało.
start_time <- Sys.time()
cat('Start:', format(start_time), '
')
Sys.sleep(0.05)
end_time <- Sys.time()
cat('End :', format(end_time), '
')difftime() do mierzenia przedziałów czasu
difftime(end, start, units='secs') oblicza różnicę między dwoma znacznikami czasu POSIXct. Można wybrać jednostkę: 'secs', 'mins', 'hours', 'days'.
Funkcja ta naturalnie współpracuje z Sys.time(), zapewniając czytelne wyniki pomiaru czasu.
t1 <- Sys.time()
x <- cumsum(1:500000)
t2 <- Sys.time()
delta <- difftime(t2, t1, units = 'secs')
cat('Time taken:', round(as.numeric(delta), 4), 'seconds
')Pomiar czasu w pętli za pomocą replicate()
Pojedynczy pomiar czasu może się różnić ze względu na garbage collection lub planowanie zadań przez system operacyjny. replicate(n, system.time(expr)['elapsed']) uruchamia wyrażenie wiele razy i zwraca wektor czasów zegarowych.
Mediana powtórzonych pomiarów daje stabilniejsze oszacowanie.
times <- replicate(10, system.time({
x <- rnorm(10000)
mean(x)
})['elapsed'])
cat('Median elapsed:', median(times), 'seconds
')
cat('Range:', range(times), '
')Porównywanie dwóch podejść
Należy użyć system.time(), aby bezpośrednio porównać dwie implementacje tego samego zadania. Ten schemat pomaga potwierdzić, że jedno podejście jest szybsze, zanim zdecydują się Państwo na jego zastosowanie.
n <- 100000
t_loop <- system.time({
result <- numeric(n)
for (i in seq_len(n)) result[i] <- i^2
})['elapsed']
t_vec <- system.time({
result <- seq_len(n)^2
})['elapsed']
cat('Loop :', t_loop, 's
')
cat('Vector :', t_vec, 's
')
cat('Speedup:', round(t_loop / max(t_vec, 1e-6), 1), 'x
')Pomiar czasu operacji zagnieżdżonych
Można zagnieżdżać wywołania system.time() lub umieszczać punkty kontrolne proc.time() w przepływie pracy, aby ustalić, który etap jest wąskim gardłem.
Proszę wyświetlać pośrednie różnice czasu podczas działania skryptu, aby utworzyć oś czasu potoku przetwarzania.
p0 <- proc.time()
x <- rnorm(200000)
p1 <- proc.time()
y <- sort(x)
p2 <- proc.time()
z <- cumsum(y)
p3 <- proc.time()
cat('Generate:', (p1-p0)['elapsed'], 's
')
cat('Sort :', (p2-p1)['elapsed'], 's
')
cat('Cumsum :', (p3-p2)['elapsed'], 's
')Praktyczne wskazówki dotyczące pomiaru czasu
Podczas mierzenia czasu wykonywania kodu R należy pamiętać o następujących zasadach:
- Uruchomić kod raz przed pomiarem, aby rozgrzać JIT i pamięci podręczne plików
- Użyć
gc()przed pomiarem, aby zresetować stan garbage collection - W replikacjach preferować medianę zamiast średniej — wartości odstające wynikające z GC zniekształcają średnią
- Mierzyć wąskie gardło, a nie cały skrypt
gc() # clear garbage before timing
times <- replicate(5, system.time({
m <- matrix(rnorm(1000 * 1000), nrow = 1000)
crossprod(m)
})['elapsed'])
cat('Median:', median(times), 's
')Szybkie sprawdzenie: składowe system.time()
Która składowa system.time() oznacza rzeczywistą liczbę sekund zegarowych, które upłynęły podczas wykonywania?
Podsumowanie pomiaru wydajności
Mają już Państwo trzy uzupełniające się narzędzia do pomiaru czasu w base R:
system.time(expr)— najszybszy sposób pomiaru pojedynczego wyrażenia; zwraca wartości user/sys/elapsedproc.time()— pomiar oparty na migawkach dla dowolnych bloków koduSys.time()+difftime()— znaczniki czasu zegarowego i czytelne dla człowieka przedziały czasu
Należy użyć replicate(), aby uzyskać stabilne mediany pomiarów przed wyciąganiem wniosków dotyczących wydajności.
Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „system.time() i proc.time()” jest bezpłatna?
Tak — pełny tekst „system.time() i proc.time()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „system.time() i proc.time()”?
Mierz czas rzeczywisty, czas użytkownika i czas systemowy wykonywania wyrażeń R. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „system.time() i proc.time()”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- system.time() i proc.time()
- Profilowanie kodu za pomocą Rprof i profvis
- Wektoryzacja na potrzeby wydajności
- Benchmarking za pomocą microbenchmark