Em termos de computador, new Date()
e as regular expression
soluções são lentas! Se você deseja uma linha única super-rápida (e super-enigmática), tente esta (assumindo que m
esteja no Jan=1
formato). Continuo tentando diferentes alterações de código para obter o melhor desempenho.
Minha versão mais rápida atual :
Depois de analisar esta questão relacionada , verificar o ano bissexto usando operadores bit a bit (velocidade incrível) e descobrir o que os números mágicos 25 e 15 representavam, eu vim com esse híbrido otimizado de respostas:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Dada a mudança de bits, isso obviamente pressupõe que seus parâmetros m
& y
são números inteiros, pois a passagem de números e seqüências de caracteres resultaria em resultados estranhos.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Resultados do JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Por alguma razão, (m+(m>>3)&1)
é mais eficiente do que (5546>>m&1)
em quase todos os navegadores.
A única competição real de velocidade é do @GitaarLab, então eu criei um JSPerf frente a frente para testarmos: http://jsperf.com/days-in-month-head-to-head/5
Funciona com base na minha resposta do ano bissexto aqui: javascript para encontrar o ano bissexto esta resposta aqui Verifique o ano bissexto usando operadores bit a bit (velocidade incrível) , bem como a seguinte lógica binária.
Uma rápida lição em meses binários:
Se você interpretar o índice dos meses desejados (Jan = 1) em binário , notará que meses com 31 dias têm o bit 3 claro e o bit 0 definido ou o bit 3 definido e o bit 0 limpo.
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
Isso significa que você pode mudar o valor 3 lugares com >> 3
, XOR os bits com o original ^ m
e ver se o resultado está 1
ou 0
na posição de bit 0 usando & 1
. Nota: Acontece que +
é um pouco mais rápido que XOR ( ^
) e (m >> 3) + m
fornece o mesmo resultado no bit 0.
Resultados do JSPerf : http://jsperf.com/days-in-month-perf-test/6