...除了使用#!/usr/bin/env Rscript
和 littler 调用 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)
这是更小的文件:
#!/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 (反之亦然)?
答案 0 :(得分:20)
快速评论:
路径/usr/local/bin/r
是任意的,您可以使用/usr/bin/env r
以及我们在某些示例中执行的操作。我记得,它限制了你可以给r
提供的其他论点,因为当通过env
我不明白你的基准,以及为什么你这样做。我们做在来源中进行时间比较,请参阅tests/timing.sh
和tests/timing2.sh
。也许你想在启动和图形创建之间分割测试或者你想要的任何东西。
每当我们进行这些测试时,小家伙都会赢。 (当我现在重新运行它时,它仍然赢了。)这对我们来说是有道理的,因为如果你查看Rscript.exe
的来源,它通过在最终调用{{execv(cmd, av)
之前设置环境和命令字符串而有所不同。 1}}。小家伙可以更快开始。
主要价格是便携性。建立littler的方式,它不会成为Windows。或者至少不容易。 OTOH,如果有人真的想要,我们已经移植到了这里......
Littler于2006年9月首次亮相而Rscript于2007年4月获得R 2.5.0。
Rscript现在到处都是R。这是一个很大的优势。
在我看来,命令行选项对于小家伙来说更为明智。
两者都使用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库中获取I / O(打印和绘图),因此我预计会有一些差别。