Về mặt máy tính, new Date()
và regular expression
các giải pháp là chậm! Nếu bạn muốn một lớp lót siêu nhanh (và siêu khó hiểu), hãy thử cái này (giả sử m
là ở Jan=1
định dạng). Tôi tiếp tục thử các thay đổi mã khác nhau để có hiệu suất tốt nhất.
Phiên bản nhanh nhất hiện tại của tôi :
Sau khi xem câu hỏi liên quan này Kiểm tra năm nhuận bằng cách sử dụng các toán tử bitwise (tốc độ đáng kinh ngạc) và khám phá ra con số ma thuật 25 & 15 được thể hiện là gì, tôi đã đưa ra câu trả lời được tối ưu hóa này:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Với sự dịch chuyển bit, điều này rõ ràng giả định rằng các tham số m
& của bạn y
đều là số nguyên, vì việc truyền số dưới dạng chuỗi sẽ dẫn đến kết quả kỳ lạ.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Kết quả của JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Đối với một số lý do, (m+(m>>3)&1)
là hiệu quả hơn (5546>>m&1)
trên hầu hết tất cả các trình duyệt.
Sự cạnh tranh thực sự duy nhất về tốc độ là từ @GitaarLab, vì vậy tôi đã tạo ra một tệp JSPerf trực tiếp để chúng tôi thử nghiệm trên: http://jsperf.com/days-in-month-head-to-head/5
Nó hoạt động dựa trên câu trả lời năm nhuận của tôi ở đây: javascript để tìm năm nhuận câu trả lời này ở đây Kiểm tra năm nhuận bằng cách sử dụng các toán tử bitwise (tốc độ đáng kinh ngạc) cũng như logic nhị phân sau.
Một bài học nhanh trong tháng nhị phân:
Nếu bạn diễn giải chỉ số của các tháng mong muốn (tháng 1 = 1) theo nhị phân, bạn sẽ nhận thấy rằng các tháng có 31 ngày có bit 3 rõ ràng và bit 0 được đặt, hoặc bit 3 được đặt và bit 0 rõ ràng.
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
Điều đó có nghĩa là bạn có thể thay đổi giá trị 3 vị trí với >> 3
, XOR các bit với bản gốc ^ m
và xem kết quả là 1
hoặc 0
ở vị trí bit 0 bằng cách sử dụng & 1
. Lưu ý: Hóa ra +
là nhanh hơn một chút so với XOR ( ^
) và (m >> 3) + m
cho kết quả tương tự trong bit 0.
Kết quả của JSPerf : http://jsperf.com/days-in-month-perf-test/6