En términos informáticos, ¡ new Date()
y las regular expression
soluciones son lentas! Si quieres un trazador de líneas súper rápido (y súper críptico), prueba este (suponiendo que m
esté enJan=1
formato). Sigo probando diferentes cambios de código para obtener el mejor rendimiento.
Mi versión más rápida actual :
Después de ver esta pregunta relacionada, verifique el año bisiesto utilizando operadores bit a bit (velocidad sorprendente) y descubra lo que representaban los números mágicos 25 y 15, se me ocurrió este híbrido optimizado de respuestas:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Dado el cambio de bits, esto obviamente supone que sus parámetros m
& y
son ambos enteros, ya que pasar números como cadenas daría como resultado resultados extraños.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Resultados de JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Por alguna razón, (m+(m>>3)&1)
es más eficiente que (5546>>m&1)
en casi todos los navegadores.
La única competencia real por la velocidad es de @GitaarLab, así que he creado un JSPerf cabeza a cabeza para que podamos probarlo en: http://jsperf.com/days-in-month-head-to-head/5
Funciona en función de la respuesta de mi año bisiesto aquí: javascript para encontrar el año bisiesto esta respuesta aquí Verificación del año bisiesto utilizando operadores bit a bit (velocidad sorprendente) así como la siguiente lógica binaria.
Una lección rápida en meses binarios:
Si interpreta el índice de los meses deseados (Jan = 1) en binario , notará que los meses con 31 días tienen el bit 3 claro y el bit 0 establecido, o el bit 3 establecido y el bit 0 claro.
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
Eso significa que puede cambiar el valor 3 lugares con >> 3
, XOR los bits con el original ^ m
y ver si el resultado está 1
o 0
en la posición de bit 0 usando & 1
. Nota: Resulta que +
es un poco más rápido que XOR ( ^
) y (m >> 3) + m
da el mismo resultado en el bit 0.
Resultados de JSPerf : http://jsperf.com/days-in-month-perf-test/6