Разница между Rscript и Литтлер - PullRequest
36 голосов
/ 08 июля 2010

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

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

Вот файл 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)

и вот файл меньшего размера:

#!/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 редактируются в текстовый файл, поэтому импортируются в R с read.table. Я создал скрипт bash для выполнения каждого скрипта 1000 раз, а затем вычислил средние значения.

Вот скрипт bash:

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 Ответ

20 голосов
/ 08 июля 2010

Пара быстрых комментариев:

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

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

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

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

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

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

  7. На мой взгляд, параметры командной строки немного более понятны.

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

Так что это личное предпочтение. Я написал в соавторстве Литтлера, многому научился (например, для 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, так что я ожидаю небольшую разницу.

...