Vâng, thời gian để giải cứu một lần nữa. Nó có vẻ như switch
là nhanh hơn các if
câ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 switch
câ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 switch
nó:
switch(type, case1=1, case2=, case3=2.5, 99)
Điều này ánh xạ case2
và case3
đến 2.5
và (không tên) mặc định thành 99
. Để biết thêm thông tin, hãy thử?switch