У комп'ютерній термінології, new Date()
і regular expression
рішення повільно! Якщо ви хочете надшвидкий (і супер-криптичний) однопластовий, спробуйте цей (припустимо m
, що у Jan=1
форматі). Я намагаюся змінити різні коди, щоб досягти найкращої продуктивності.
Моя поточна найшвидша версія:
Переглянувши це пов'язане питання Перевірка року у високосному періоді за допомогою побітових операторів (дивовижна швидкість) та виявивши, що представляє собою магічне число 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
Це працює на основі моєї відповіді високосного року тут: javascript, щоб знайти високосний рік, ця відповідь тут. Перевірити рік випуску за допомогою побітових операторів (дивовижна швидкість) , а також наступної бінарної логіки.
Швидкий урок у двійкові місяці:
Якщо ви інтерпретуєте індекс бажаних місяців (січ = 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