Rscript和littler之间的区别

aL3*_*3xa 36 scripting r execution-time

......除了这个事实,RSCRIPT被调用,#!/usr/bin/env Rscript利特勒#!/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)
Run Code Online (Sandbox Code Playgroud)

这是更小的文件:

#!/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)
Run Code Online (Sandbox Code Playgroud)

如您所见,它们几乎相同(第一行和接收器文件参数不同).输出被sink编辑到文本文件,因此导入R中read.table.我创建了bash脚本来执行每个脚本1000次,然后计算平均值.

这是bash脚本:

for i in `seq 1000`
do
./$1
echo "####################"
echo "Iteration #$i"
echo "####################"
done
Run Code Online (Sandbox Code Playgroud)

结果是:

# 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 
Run Code Online (Sandbox Code Playgroud)

长话短说:在(明显的)执行时间差异旁边,还有其他一些区别吗?更重要的问题是:为什么应该/不应该你喜欢利特勒RSCRIPT(反之亦然)?

Dir*_*tel 20

几个快速评论:

  1. 路径/usr/local/bin/r是任意的,你可以/usr/bin/env r像我们在一些例子中那样使用.我记得,它限制了你可以提供的其他参数,r因为在调用via时它只需要一个env

  2. 我不明白你的基准,以及为什么你这样做.我们确实在源中进行了时序比较,请参阅tests/timing.shtests/timing2.sh.也许你想在启动和图形创建之间分割测试或者你想要的任何东西.

  3. 每当我们进行这些测试时,小家伙都会赢.(当我现在重新运行它们时,它仍然赢了.)这对我们来说是有道理的,因为如果你查看源代码Rscript.exe,它会通过在最终调用之前设置环境和命令字符串而有所不同execv(cmd, av).小家伙可以更快开始.

  4. 主要价格是便携性.建立littler的方式,它不会成为Windows.或者至少不容易.OTOH我们有RInside移植所以,如果有人真的想......

  5. Littler于2006年9月首次亮相而Rscript于2007年4月以2.5.0的价格获得.

  6. Rscript现在到处都是R.这是一个很大的优势.

  7. 在我看来,命令行选项对于小家伙来说更为明智.

  8. 两者都使用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"])
Run Code Online (Sandbox Code Playgroud)

甚至

  mean( replicate(N, system.time(fun)["elapsed"]), trim=0.05)
Run Code Online (Sandbox Code Playgroud)

摆脱异常值.此外,您只能从R库中获取I/O(打印和绘图),因此我预计会有一些差别.