Вам следует подумать о том, чтобы использовать что-то похожее:
#!/bin/bash
# Create file of all installed packages
Rscript -e 'writeLines(unname(installed.packages()[,1]), "installed-pkgs.txt")'
# Iterate over the file, benchmarking package load 3x (consider bumping this up)
while read -r pkg; do
echo -n "Benchmarking package [${pkg}]"
for iter in {1..3}; do
echo -n "."
Rscript --vanilla \
-e 'args <- commandArgs(TRUE)' \
-e 'invisible(suppressPackageStartupMessages(xdf <- as.data.frame(as.list(system.time(library(args[1], character.only=TRUE), FALSE)))))' \
-e 'xdf$pkg <- args[1]' \
-e 'xdf$iter <- args[2]' \
-e 'xdf$loaded_namespaces <- I(list(loadedNamespaces()))' \
-e 'saveRDS(xdf, file.path("data", sprintf("%s-%s.rds", args[1], args[2])))' \
"${pkg}" \
"${iter}"
done
echo ""
done <installed-pkgs.txt
Я создал каталог ~/projects/pkgbench
с подкаталогом data
и поместил ^^ в ~/projects/pkgbench
.С его помощью вы:
- получаете чистый (ванильный) R-сеанс при каждом запуске
- 3 итерации для каждого (увеличьте его, если хотите)
- один файл RDSза каждую итерацию
- количество пакетов (включая имена) в пост-загрузке пространства имен сеанса в файлах RDS
Когда он запускается (из сеанса терминала не-RStudio на вашемокно macOS) вы получаете прогресс (одна точка за итерацию):
$ ./pkgbench.sh
Benchmarking package [abind]...
Benchmarking package [acepack]...
Benchmarking package [AER]...
Benchmarking package [akima]...
Затем вы можете сделать что-то вроде (я убил тест после нескольких pkgs):
library(hrbrthemes) # github/gitlab
library(tidyverse)
map_df(
list.files("~/projects/pkgbench/data", full.names = TRUE),
readRDS
) %>% tbl_df() %>% print() -> bench_df
## # A tibble: 141 x 8
## user.self sys.self elapsed user.child sys.child pkg iter loaded_namespaces
## <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <list>
## 1 0.00500 0.00100 0.00700 0. 0. abind 1 <chr [9]>
## 2 0.00600 0.00100 0.00700 0. 0. abind 2 <chr [9]>
## 3 0.00600 0.00100 0.00600 0. 0. abind 3 <chr [9]>
## 4 0.00500 0.00100 0.00600 0. 0. acepack 1 <chr [9]>
## 5 0.00600 0.001000 0.00800 0. 0. acepack 2 <chr [9]>
## 6 0.00500 0.00100 0.00600 0. 0. acepack 3 <chr [9]>
## 7 1.11 0.0770 1.19 0. 0. AER 1 <chr [36]>
## 8 1.04 0.0670 1.11 0. 0. AER 2 <chr [36]>
## 9 1.07 0.0720 1.15 0. 0. AER 3 <chr [36]>
## 10 0.136 0.0110 0.147 0. 0. akima 1 <chr [12]>
## # ... with 131 more rows
group_by(bench_df, pkg) %>%
summarise(
med_elapsed = median(elapsed),
ns_ct = length(loaded_namespaces[[1]])
) -> bench_sum
ggplot(bench_sum, aes("elapsed", med_elapsed)) +
geom_violin(fill = ft_cols$gray) +
ggbeeswarm::geom_quasirandom(color = ft_cols$yellow) +
geom_boxplot(color = "white", fill="#00000000", outlier.colour = NA) +
theme_ft_rc(grid="Y")
![enter image description here](https://i.stack.imgur.com/ANBJY.png)
ggplot(bench_sum, aes(ns_ct, med_elapsed)) +
geom_point(color = ft_cols$yellow) +
geom_smooth(color = ft_cols$peach) + # shld prbly use something better than loess
theme_ft_rc(grid = "XY")
![enter image description here](https://i.stack.imgur.com/dUyGT.png)
Если вы собираетесь запустить его в одночасье, убедитесь, что вы отключили все «сонные / холостые»"время, которое macOS может сделать для вас (например, отключить любые тяжелые заставки, запретить перевести диски в спящий режим и т. д.).
Обратите внимание, что я запретил печатать сообщения о запуске пакета.Вы можете вместо этого capture.output()
или провести сравнение с этим и без него.
library()
также имеет все эти параметры:
library(
package,
help,
pos = 2,
lib.loc = NULL,
character.only = FALSE,
logical.return = FALSE,
warn.conflicts = TRUE,
quietly = FALSE,
verbose = getOption("verbose")
)
Вы можете настроить их для различныхТестирование также выполняется.
Я также смотрел только на медиану «что чувствовал пользователь при загрузке пакета» .Подумайте о проверке всех значений system.time
, которые находятся во фрейме данных.
Если ваш Mac достаточно мощен по процессору и у вас быстрый твердотельный диск, вы могли бы рассмотрите возможность использования GNU parallel
с этим жгутом для ускорения времени.Я бы определенно использовал более 3 итераций для каждого пакета, если вы сделаете это и будете достаточно консервативны с количеством параллельных параллельных прогонов.