С точки зрения компьютера, решения 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, чтобы найти високосный год этот ответ здесь Проверка високосного года с использованием побитовых операторов (потрясающая скорость) , а также следующая двоичная логика .
Быстрый урок в двоичных месяцах:
Если вы интерпретируете индекс нужных месяцев (Jan = 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