2010-07-08 5 views
35

... outre le fait que RSCRIPT est appelé avec #!/usr/bin/env Rscript et Littler avec #!/usr/local/bin/r (sur mon système) en première ligne du fichier de script. J'ai trouvé certaines différences dans la vitesse d'exécution (semble littler est un peu plus lent).Différence entre RSCRIPT et Littler

J'ai créé deux scripts fictifs, exécutés tous les 1000 fois et comparé le temps d'exécution moyen.

Voici le fichier 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) 

et voici le fichier 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) 

Comme vous pouvez le voir, ils sont presque identiques (première ligne et l'argument de fichier évier diffèrent). La sortie est sink ed dans le fichier texte, donc importé dans R avec read.table. J'ai créé un script bash pour exécuter chaque script 1000 fois, puis des moyennes calculées.

script bash est ici:

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

Et les résultats sont les suivants:

# 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 

Longue histoire courte: à côté (évident) différence exécution en temps, est-il une autre différence? Plus important question est: pourquoi devriez/préférez-vous littler sur Rscript (ou vice versa)?

+1

+1 Bonne question; aime le détail. – Shane

+0

Merci Shane, le fichier de données est disponible ici: http://bit.ly/ac0Fb1 Remarquez que j'ai une machine très lente, donc si vous décidez d'exécuter ces scripts, vous aurez plus de chances d'obtenir des valeurs plus basses. Les bonnes réponses de Dirk, comme d'habitude, ont attiré l'attention sur d'autres problèmes avec ces scripts de référence ... alors prenez ces résultats cum grano salis. – aL3xa

Répondre

20

Couple commentaires rapides:

  1. Le chemin /usr/local/bin/r est arbitraire, vous pouvez utiliser /usr/bin/env r ainsi que nous le faisons dans quelques exemples. Si je me souviens, il limite ce que les autres arguments que vous pouvez donner à r car il ne prend qu'un seul lorsque appelé via env

  2. Je ne comprends pas votre référence, et pourquoi vous le ferait de cette façon. Nous faire ont des comparaisons de synchronisation dans les sources, voir tests/timing.sh et tests/timing2.sh. Peut-être que vous voulez diviser le test entre le démarrage et la création de graphiques ou ce que vous recherchez.

  3. Chaque fois que nous avons effectué ces tests, Littler a gagné. (Cela a quand même gagné quand je les ai relancé maintenant.) Ce qui a du sens pour nous parce que si vous regardez les sources à Rscript.exe, cela fonctionne différemment en configurant l'environnement et une chaîne de commande avant d'appeler finalement execv(cmd, av). Littler peut commencer un peu plus vite.

  4. Le prix principal est la portabilité. La façon dont Littler est construit, il ne le fera pas à Windows. Ou du moins pas facilement. OTOH nous avons porté RInside donc si quelqu'un voulait vraiment ...

  5. Littler est arrivé en premier en Septembre 2006 contre Rscript qui est venu avec R 2.5.0 en avril 2007.

  6. Rscript est maintenant partout où R est. C'est un gros avantage.

  7. Les options de ligne de commande sont un peu plus sensibles pour Littler selon moi.

  8. Les deux fonctionnent avec les paquets CRAN getopt et optparse pour l'analyse des options.

Donc c'est une préférence personnelle. J'ai co-écrit littler, j'ai beaucoup appris à le faire (par exemple pour RInside) et je trouve toujours cela utile - je l'utilise donc des dizaines de fois par jour. Il conduit les CRANberries. Il conduit cran2deb. Votre kilométrage peut, comme il le dit, varier.

Clause de non-responsabilité: littler est l'un de mes projets.

Postscriptum: J'aurais écrit le test comme

je l'aurais écrit ce que

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

ou même

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

pour se débarrasser des valeurs aberrantes. De plus, vous ne mesurez qu'essentiellement les E/S (une impression et un tracé) qui proviendront toutes deux de la bibliothèque R, donc je m'attendrais à peu de différence.

+1

Dirk, merci pour une réponse rapide et approfondie! Je m'attendais à votre réponse avec beaucoup d'anxiété, à cause de votre implication dans ce projet (et, oui, je le savais avant de commencer un post). Ad 1: J'utilise ArchLinux, et j'obtiens seulement '/ usr/local/bin/r' avec' whereis r'. Si je mets '/ usb/bin/env r', une erreur se produit. Ad 2: Je vais essayer les tests. Je sais que littler devrait fonctionner plus rapidement, et je suis toujours étonné par le fait que littler a effectué plus lentement avec la création de graphique. Ad 3: Je ne comprends pas, vous avez couru des scripts de mon poste, et obtenu des résultats différents? Pouvez-vous, s'il vous plaît, les poster? – aL3xa

+0

Vous pourriez avoir envoyé un email :) Re 1: Aucune erreur ici, assurez-vous que vous avez des modes corrects et tout. Re 2: Mes tests portaient sur la vitesse à laquelle chaque variante démarre; une fois commencé je m'attendrais à ce qu'ils fassent la même chose car ils utilisent tous le même sous-jacente R. Re 3: Non, je n'ai pas utilisé votre script; J'essayais juste de montrer que l'on devrait utiliser 'system.time (expression)' plutôt que la construction 'proc.time()'. –

+1

OK, je vais changer les scripts factices (nommés d'après leur auteur) et voir ce qui se passe. – aL3xa