R Academy · Lekcja

system.time() i proc.time()

Mierz czas rzeczywisty, czas użytkownika i czas systemowy wykonywania wyrażeń R.

Lekcja 1 z 413 kroki

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 R
  • sys.self — czas procesora systemu dla procesu R
  • elapsed — 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/elapsed
  • proc.time() — pomiar oparty na migawkach dla dowolnych bloków kodu
  • Sys.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.

Bezpłatny start

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

  1. system.time() i proc.time()
  2. Profilowanie kodu za pomocą Rprof i profvis
  3. Wektoryzacja na potrzeby wydajności
  4. Benchmarking za pomocą microbenchmark
← Powrót do R Academy