Vâng, thời gian để giải cứu một lần nữa. Nó có vẻ như switchlà nhanh hơn các ifcâu lệnh. Vì vậy, và thực tế là mã ngắn hơn / gọn gàng hơn với một switchcâu lệnh nghiêng về switch:
# Simplified to only measure the overhead of switch vs if
test1 <- function(type) {
switch(type,
mean = 1,
median = 2,
trimmed = 3)
}
test2 <- function(type) {
if (type == "mean") 1
else if (type == "median") 2
else if (type == "trimmed") 3
}
system.time( for(i in 1:1e6) test1('mean') ) # 0.89 secs
system.time( for(i in 1:1e6) test2('mean') ) # 1.13 secs
system.time( for(i in 1:1e6) test1('trimmed') ) # 0.89 secs
system.time( for(i in 1:1e6) test2('trimmed') ) # 2.28 secs
Cập nhật Với nhận xét của Joshua, tôi đã thử các cách khác để đánh giá điểm chuẩn. Dấu hiệu vi mô có vẻ là tốt nhất. ... và nó hiển thị thời gian tương tự:
> library(microbenchmark)
> microbenchmark(test1('mean'), test2('mean'), times=1e6)
Unit: nanoseconds
expr min lq median uq max
1 test1("mean") 709 771 864 951 16122411
2 test2("mean") 1007 1073 1147 1223 8012202
> microbenchmark(test1('trimmed'), test2('trimmed'), times=1e6)
Unit: nanoseconds
expr min lq median uq max
1 test1("trimmed") 733 792 843 944 60440833
2 test2("trimmed") 2022 2133 2203 2309 60814430
Cập nhật cuối cùng Đây cho thấy mức độ linh hoạt của switchnó:
switch(type, case1=1, case2=, case3=2.5, 99)
Điều này ánh xạ case2và case3đến 2.5và (không tên) mặc định thành 99. Để biết thêm thông tin, hãy thử?switch