2010-07-08 50 views
35

... bên cạnh thực tế là Rscript được gọi với #!/usr/bin/env RscriptLittler với #!/usr/local/bin/r (trên hệ thống của tôi) ở dòng đầu tiên của file script. Tôi đã tìm thấy sự khác biệt nhất định về tốc độ thực thi (có vẻ như littler chậm hơn một chút).Sự khác nhau giữa Rscript và Littler

Tôi đã tạo hai tập lệnh giả, chạy mỗi 1000 lần và so sánh thời gian thực hiện trung bình.

Dưới đây là file 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) 

và đây là file 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) 

Như bạn có thể thấy, họ gần như giống hệt nhau (dòng đầu tiên và chìm file đối số khác nhau). Đầu ra là sink được chỉnh sửa thành tệp văn bản, do đó được nhập bằng R với read.table. Tôi đã tạo tập lệnh bash để thực thi mỗi kịch bản 1000 lần, sau đó tính trung bình.

Dưới đây là bash script:

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

Và kết quả là:

# 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 

câu chuyện dài ngắn: bên cạnh (hiển nhiên) sự khác biệt thực hiện theo thời gian, có một số khác biệt khác? Câu hỏi quan trọng hơn là: tại sao/không nên bạn thích littler trên Rscript (hoặc ngược lại)?

+1

+1 Câu hỏi hay; yêu chi tiết. – Shane

+0

Cảm ơn Shane, tập tin dữ liệu có sẵn ở đây: http://bit.ly/ac0Fb1 Lưu ý rằng tôi có máy rất chậm, vì vậy nếu bạn quyết định chạy các tập lệnh này, bạn có nhiều khả năng nhận được các giá trị thấp hơn. Câu trả lời tuyệt vời của Dirk, như thường lệ, đã thu hút sự chú ý đến các vấn đề khác với các kịch bản chuẩn này ... vì vậy, hãy xem những kết quả này là grano salis. – aL3xa

Trả lời

20

Couple bình luận nhanh:

  1. Đường dẫn /usr/local/bin/r là tùy ý, bạn có thể sử dụng /usr/bin/env r cũng như chúng ta làm trong một số ví dụ. Khi tôi nhớ lại, nó giới hạn những đối số khác mà bạn có thể cung cấp cho r vì chỉ có một đối số khi được gọi qua env

  2. Tôi không hiểu điểm chuẩn của bạn và tại sao bạn làm như vậy. Chúng tôi do có so sánh thời gian trong các nguồn, xem tests/timing.shtests/timing2.sh. Có thể bạn muốn tách thử nghiệm giữa khởi động và tạo đồ thị hoặc bất kỳ thứ gì bạn đang làm.

  3. Bất cứ khi nào chúng tôi chạy các thử nghiệm đó, littler đã thắng. (Nó vẫn thắng khi tôi chạy lại chúng ngay bây giờ.) Điều đó có ý nghĩa với chúng tôi bởi vì nếu bạn nhìn vào các nguồn tới Rscript.exe, nó hoạt động khác nhau bằng cách thiết lập môi trường và chuỗi lệnh trước khi gọi số execv(cmd, av). littler có thể bắt đầu nhanh hơn một chút.

  4. Giá chính là tính di động. Cách littler được xây dựng, nó sẽ không biến nó thành Windows. Hoặc ít nhất là không dễ dàng. OTOH chúng tôi có RInside được chuyển vì vậy nếu ai đó thực sự muốn ...

  5. Littler đến trước vào tháng 9 năm 2006 so với Rscript đi kèm với R 2.5.0 vào tháng 4 năm 2007.

  6. Rscript giờ đây ở mọi nơi có R. Đó là một lợi thế lớn.

  7. Tùy chọn dòng lệnh trở nên hợp lý hơn một chút đối với người littler trong chế độ xem của tôi.

  8. Cả hai hoạt động với gói CRAN getopt và chọn tham gia để phân tích cú pháp tùy chọn.

Vì vậy, đó là sở thích cá nhân. Tôi đồng viết littler, học được rất nhiều làm điều đó (ví dụ như cho RInside) và vẫn thấy nó hữu ích - vì vậy tôi sử dụng nó hàng chục lần mỗi ngày. Nó thúc đẩy CRANberries. Nó điều khiển cran2deb. Số dặm của bạn có thể, như này nói, thay đổi.

Tuyên bố từ chối trách nhiệm: littler là một trong các dự án của tôi.

Postscriptum: Tôi đã viết các bài kiểm tra như

tôi sẽ có văn bản này như

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

hoặc thậm chí

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

để thoát khỏi những giá trị ngoại biên. Hơn nữa, bạn chỉ về cơ bản đo I/O (một bản in, và một cốt truyện) mà cả hai sẽ nhận được từ thư viện R vì vậy tôi mong đợi sự khác biệt nhỏ.

+1

Dirk, cảm ơn câu trả lời nhanh chóng và kỹ lưỡng! Tôi mong đợi phản ứng của bạn với rất nhiều lo âu, vì sự tham gia của bạn trong dự án này (và, vâng, tôi biết rằng trước khi bắt đầu một bài đăng). Quảng cáo 1: Tôi sử dụng ArchLinux và tôi chỉ nhận được '/ usr/local/bin/r' với' whereis r'. Nếu tôi đặt lỗi '/ usb/bin/env r' xảy ra. Quảng cáo 2: Tôi sẽ thử nghiệm. Tôi biết rằng Littler nên thực hiện nhanh hơn, và tôi vẫn ngạc nhiên bởi thực tế là Littler thực hiện chậm hơn với việc tạo ra đồ thị. Quảng cáo 3: Tôi không hiểu, bạn chạy tập lệnh tạo thành bài đăng của tôi và có kết quả khác nhau? Bạn có thể, xin vui lòng, gửi cho họ? – aL3xa

+0

Bạn có thể đã gửi email cho tôi :) Re 1: Không có lỗi ở đây, hãy chắc chắn rằng bạn có chế độ chính xác và tất cả mọi thứ. Re 2: Các thử nghiệm của tôi về tốc độ của từng biến thể khác nhau bắt đầu; một khi bắt đầu, tôi sẽ mong đợi họ làm giống như tất cả họ sử dụng cùng một cơ sở R. Re 3: Không, tôi đã không sử dụng kịch bản của bạn; Tôi chỉ cố gắng để cho thấy rằng một trong những nên sử dụng 'system.time (expression)' chứ không phải là 'proc.time()' xây dựng. –

+1

OK, tôi sẽ thay đổi các tập lệnh giả (được đặt tên theo tác giả của họ) và xem điều gì xảy ra. – aL3xa

Các vấn đề liên quan