W kategoriach komputerowych, new Date()
a regular expression
rozwiązania są powolne! Jeśli chcesz superszybkiego (i super-kryptycznego) jedno-liniowego, wypróbuj ten (zakładając, że m
ma Jan=1
format). Próbuję różnych zmian kodu, aby uzyskać najlepszą wydajność.
Moja aktualna najszybsza wersja:
Po przeanalizowaniu tego powiązanego pytania Sprawdź rok przestępny za pomocą operatorów bitowych (niesamowita prędkość) i odkryłem, co reprezentuje magiczna liczba 25 i 15, wymyśliłem tę zoptymalizowaną hybrydę odpowiedzi:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Biorąc pod uwagę przesunięcie bitów, to oczywiście zakłada, że obie parametry m
i y
parametry są liczbami całkowitymi, ponieważ przekazywanie liczb jako ciągów spowoduje dziwne wyniki.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Wyniki JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Z jakiegoś powodu (m+(m>>3)&1)
jest bardziej wydajny niż (5546>>m&1)
w prawie wszystkich przeglądarkach.
Jedyną prawdziwą konkurencją dla prędkości jest @GitaarLab, więc stworzyłem JSPerf head-to-head do przetestowania na: http://jsperf.com/days-in-month-head-to-head/5
Działa w oparciu o moją odpowiedź na rok przestępny tutaj: javascript, aby znaleźć rok przestępny tę odpowiedź tutaj Sprawdzanie roku przestępnego za pomocą operatorów bitowych (niesamowita prędkość), a także następującą logikę binarną.
Szybka lekcja w miesiącach binarnych:
Jeśli interpretujesz indeks żądanych miesięcy (Jan = 1) w systemie binarnym , zauważysz, że miesiące z 31 dniami mają albo bit 3 skasowany i bit ustawiony 0, albo bit 3 ustawiony i bit 0 czysty.
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
Oznacza to, że możesz przesunąć wartość o 3 miejsca za pomocą >> 3
, XOR bitów z oryginałem ^ m
i sprawdzić, czy wynikiem jest 1
lub 0
w pozycji bitu 0 za pomocą & 1
. Uwaga: Okazuje się, że +
jest nieco szybszy niż XOR ( ^
) i (m >> 3) + m
daje ten sam wynik w bicie 0.
Wyniki JSPerf : http://jsperf.com/days-in-month-perf-test/6