ในแง่คอมพิวเตอร์new Date()
และregular expression
การแก้ปัญหาช้า! หากคุณต้องการซับแบบเร็วสุดและซับซิคติกให้ลองหนึ่งไลเนอร์ (สมมติว่าm
อยู่ในJan=1
รูปแบบ) ฉันพยายามเปลี่ยนรหัสต่าง ๆ เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด
เวอร์ชันที่เร็วที่สุดของฉันในปัจจุบัน:
หลังจากดูที่คำถามที่เกี่ยวข้องการตรวจสอบ Leap ปีโดยใช้ตัวดำเนินการระดับบิต (ความเร็วที่น่าทึ่ง)และค้นพบว่าหมายเลขเวทมนต์ 25 & 15 แสดงถึงอะไรฉันได้พบกับคำตอบที่ดีที่สุดนี้
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
เมื่อพิจารณาถึงการเลื่อนบิตสิ่งนี้ถือว่าสมมติว่าm
& y
พารามิเตอร์ของคุณเป็นทั้งจำนวนเต็มเนื่องจากการส่งผ่านตัวเลขเป็นสตริงจะทำให้ได้ผลลัพธ์ที่แปลก
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
ผลลัพธ์ของ JSPerf: http://jsperf.com/days-in-month-head-to-head/5
ด้วยเหตุผลบางอย่าง(m+(m>>3)&1)
มีประสิทธิภาพมากขึ้นกว่า(5546>>m&1)
ในเกือบทุกเบราเซอร์
การแข่งขันความเร็วที่แท้จริงเพียงอย่างเดียวนั้นมาจาก @GitaarLab ดังนั้นฉันจึงสร้าง JSPerf แบบตัวต่อตัวเพื่อให้เราทดสอบกับ: http://jsperf.com/days-in-month-head-to-head/5
มันทำงานตามคำตอบของปีอธิกสุรทินของฉันที่นี่: จาวาสคริปต์เพื่อค้นหาปีอธิกสุรทินคำตอบนี้ที่นี่ตรวจสอบ Leap ปีโดยใช้ตัวดำเนินการระดับบิต (ความเร็วที่น่าอัศจรรย์)เช่นเดียวกับตรรกะไบนารีต่อไปนี้
บทเรียนด่วนในเดือนไบนารี:
หากคุณตีความดัชนีของเดือนที่ต้องการ (ม.ค. = 1) ในรูปแบบไบนารี่คุณจะสังเกตเห็นว่าเดือนที่มี 31 วันอาจมีบิต 3 ชัดเจนและบิต 0 ตั้งหรือบิต 3 ตั้งและบิต 0 ชัดเจน
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
นั่นหมายความว่าคุณสามารถเปลี่ยนค่า 3 สถานที่ที่มี>> 3
, XOR บิตกับต้นฉบับ^ m
และดูว่าผลที่ได้คือ1
หรือ0
ในตำแหน่งบิต 0& 1
ใช้ หมายเหตุ: ปรากฎว่า+
มันเร็วกว่า XOR ( ^
) เล็กน้อยและ(m >> 3) + m
ให้ผลลัพธ์เดียวกันในบิต 0
ผลลัพธ์ JSPerf : http://jsperf.com/days-in-month-perf-test/6