ใช้ && แทน &
เพื่อตรวจสอบว่าลูกเต๋าทั้งสองลูกออกค่าเหมือนกันหรือไม่ ฟังก์ชัน move_square() ใช้คำสั่ง if ดังนี้
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
ตัวดำเนินการ & จะประเมินค่าของทั้งสองอาร์กิวเมนต์เสมอ กล่าวคือ ถ้าเขียน x & y R จะคำนวณทั้ง x และ y ทุกครั้ง ซึ่งในบางกรณีไม่มีประสิทธิภาพ ตัวอย่างเช่น ถ้า x เป็น FALSE ผลลัพธ์ของ x & y จะเป็น FALSE อยู่แล้ว ไม่ว่าค่าของ y จะเป็นอะไรก็ตาม จึงไม่จำเป็นต้องเสียเวลาคำนวณ y ตัวดำเนินการ && ใช้ประโยชน์จากจุดนี้ โดยจะข้ามการคำนวณ y หากผลลัพธ์โดยรวมไม่เปลี่ยนแปลง
ในโค้ดนี้ หาก is_double[1] เป็น FALSE เราไม่จำเป็นต้องประเมินค่า is_double[2] หรือ is_double[3] อีกต่อไป ดังนั้นการเปลี่ยน & เป็น && จึงช่วยเพิ่มความเร็วได้
ข้อควรทราบคือ && ใช้ได้กับค่าตรรกะเดี่ยวเท่านั้น คือเวกเตอร์ตรรกะที่มีความยาว 1 (เช่นเดียวกับที่ส่งเข้าเงื่อนไข if) แต่ & สามารถใช้กับเวกเตอร์ที่มีความยาวมากกว่า 1 ได้ด้วย
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียน R Code อย่างมีประสิทธิภาพ
คำแนะนำการฝึกหัด
- สร้างฟังก์ชัน
improved_move()ที่มีลักษณะคล้ายกับmove()แต่ใช้&&แทน - ใช้
microbenchmark()เปรียบเทียบประสิทธิภาพของimproved_move()กับmove()เวอร์ชันก่อนหน้า
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Example data
is_double
# Define the previous solution
move <- function(is_double) {
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail
}
}
# Define the improved solution
improved_move <- function(is_double) {
if (is_double[1] ___ is_double[2] ___ is_double[3]) {
current <- 11 # Go To Jail
}
}
# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)