r - Rscript 和 Littler 之间的区别

标签 r scripting execution-time littler

...除此之外,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写入文本文件,因此通过read.table导入到R中。我创建了 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. 路径 /usr/local/bin/r 是任意的,您可以像我们在某些情况下一样使用 /usr/bin/env r例子。我记得,它限制了您可以向 r 提供的其他参数,因为通过 env

    调用时它只需要一个参数
  2. 我不明白你的基准,也不明白你为什么要这样做。我们确实在源代码中进行了时序比较,请参阅tests/timing.shtests/timing2.sh。也许您想将测试分为启动和图形创建或任何您想要的东西。

  3. 每当我们进行这些测试时,很少有人获胜。 (当我现在重新运行它们时,它仍然获胜。)这对我们来说很有意义,因为如果您查看 Rscript.exe 的源代码,它通过设置环境和命令字符串来工作不同在最终调用 execv(cmd, av) 之前。较小的人可以更快地开始。

  4. 主要的代价是便携性。由于构建的规模较小,因此它不会出现在 Windows 上。或者至少不容易。 OTOH,我们已经移植了 RInside,所以如果有人真的想...

  5. Littler 在 2006 年 9 月首次亮相,而 Rscript 则于 2007 年 4 月随 R 2.5.0 一起发布。

  6. Rscript 现在无处不在。这是一个很大的优势。

  7. 在我看来,命令行选项对于较小的用户来说更为明智。

  8. 两者都与 CRAN 包 getopt 和 optparse 一起使用来进行选项解析。

所以这是个人喜好。我与人共同编写了一些小东西,从中学到了很多东西(例如 RInside)并且仍然发现它很有用——所以我每天使用它数十次。它驱动蔓越莓。它驱动cran2deb。正如他们所说,您的里程可能会有所不同。

免责声明:littler 是我的项目之一。

后记:我会将测试编写为

  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)

去除异常值。此外,您本质上只测量 I/O(打印和绘图),两者都将从 R 库获得,因此我预计差异不大。

关于r - Rscript 和 Littler 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205302/

相关文章:

r - 在函数内的 dplyr 中的列中存储和调用变量

javascript - 使用 R 和 PhantomJS 进行网页抓取交互式 map (javascript)

r - 如何自动将函数加载到 R 包的命名空间中

git - 是否有针对全功能跨平台 shebang 系列的 hack?

python - 优化执行时间以检查单词的字符是否在Python列表中

r - 如何提取 lmer 输出的固定效应部分的相关性

linux - 从右边提取两个/之间的字符串

windows - 如何在不显示窗口的情况下运行 PowerShell 脚本?

c++ - 如何加快此程序以找到斐波那契数列

java - 评论数量的增加是否会增加执行时间?