Разница между Rscript и littler

... кроме того, что Rscript вызывается с #!/usr/bin/env Rscript и littler с #!/usr/local/bin/r (в моей системе) в первой строке файла script, Я обнаружил определенные отличия в скорости выполнения (кажется, что littler немного медленнее).

Я создал два фиктивных сценария, каждый раз запускал их и сравнивал среднее время выполнения.

Здесь файл Rscript:

#!/usr/bin/env Rscript

btime <- proc.time()
x <- rnorm(100)
print(x)
print(plot(x))
etime <- proc.time()
tm <- etime - btime
sink(file = "rscript.r.out", append = TRUE)
cat(paste(tm[1:3], collapse = ";"), "\n")
sink()
print(tm)

и здесь файл littler:

#!/usr/local/bin/r

btime <- proc.time()
x <- rnorm(100)
print(x)
print(plot(x))
etime <- proc.time()
tm <- etime - btime
sink(file = "little.r.out", append = TRUE)
cat(paste(tm[1:3], collapse = ";"), "\n")
sink()
print(tm)

Как вы можете видеть, они почти идентичны (аргумент файла первой строки и приемника отличается). Вывод sink ed в текстовый файл, поэтому импортируется в R с помощью read.table. Я создал bash script для выполнения каждого script 1000 раз, затем вычислял средние значения.

Здесь bash script:

for i in `seq 1000`
do
./$1
echo "####################"
echo "Iteration #$i"
echo "####################"
done

И результаты:

# littler script
> mean(lit)
    user   system  elapsed 
0.489327 0.035458 0.588647 
> sapply(lit, median)
   L1    L2    L3 
0.490 0.036 0.609 
# Rscript
> mean(rsc)
    user   system  elapsed 
0.219334 0.008042 0.274017 
> sapply(rsc, median)
   R1    R2    R3 
0.220 0.007 0.258 

Короче говоря: помимо (очевидной) разницы во времени исполнения, есть ли другая разница? Более важный вопрос: почему вы/не должны предпочесть littler над Rscript (или наоборот)?

Ответ 1

Несколько быстрых комментариев:

  • Путь /usr/local/bin/r произволен, вы можете использовать /usr/bin/env r, как и в некоторых примерах. Насколько я помню, он ограничивает другие аргументы, которые вы можете дать r, поскольку он принимает только один при вызове через env

  • Я не понимаю ваш бенчмарк и почему вы так поступаете. У нас есть временные сравнения в источниках, см. tests/timing.sh и tests/timing2.sh. Возможно, вы хотите разделить тест между запуском и созданием графа или тем, что вам нужно.

  • Всякий раз, когда мы проводили эти тесты, littler побеждал. (Он по-прежнему выиграл, когда я снова запустил их прямо сейчас.) Это имело смысл для нас, потому что если вы посмотрите на источники на Rscript.exe, он будет работать по-другому, настроив среду и командную строку, прежде чем в итоге вызывать execv(cmd, av). littler может начать немного быстрее.

  • Основная цена - мобильность. То, как littler построен, он не попадет в Windows. Или, по крайней мере, не легко. OTOH мы поместили RInside, чтобы кто-то действительно хотел...

  • Littler вышел первым в сентябре 2006 года по сравнению с Rscript, который появился с R 2.5.0 в апреле 2007 года.

  • Rscript теперь всюду, где R. Это большое преимущество.

  • Параметры командной строки немного более разумны для littler на мой взгляд.

  • Оба работают с пакетами CRAN getopt и optparse для парсинга параметров.

Так что это личное предпочтение. Я соавтором Littler, многому научился (например, для RInside) и все еще считаю это полезным, поэтому я использую его десятки раз в день. Он управляет CRANberries. Он управляет cran2deb. Ваш пробег может, как говорят, меняться.

Отказ от ответственности: littler - один из моих проектов.

Postscriptum: я бы написал тест как

Я бы написал это как

  fun <- function { X <- rnorm(100); print(x); print(plot(x)) }
  replicate(N, system.time( fun )["elapsed"])

или даже

  mean( replicate(N, system.time(fun)["elapsed"]), trim=0.05)

чтобы избавиться от выбросов. Более того, вы по существу измеряете ввод-вывод (печать и сюжет), которые оба получат из библиотеки R, поэтому я бы ожидал небольшой разницы.