En termes informatiques, new Date()
et les regular expression
solutions sont lentes! Si vous voulez une doublure ultra-rapide (et super-cryptique), essayez celle-ci (en supposant qu'elle m
est au Jan=1
format). Je continue d'essayer différentes modifications de code pour obtenir les meilleures performances.
Ma version la plus rapide actuelle :
Après avoir regardé cette question connexe Vérification de l'année bissextile en utilisant des opérateurs au niveau du bit (vitesse incroyable) et découvert ce que le nombre magique 25 et 15 représentait, j'ai trouvé cet hybride optimisé de réponses:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Compte tenu du décalage binaire, cela suppose évidemment que vos paramètres m
& y
sont tous deux des entiers, car le passage de nombres sous forme de chaînes entraînerait des résultats étranges.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Résultats JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Pour une raison quelconque, (m+(m>>3)&1)
est plus efficace que (5546>>m&1)
sur presque tous les navigateurs.
La seule vraie compétition pour la vitesse vient de @GitaarLab, j'ai donc créé un JSPerf en tête à tête pour que nous puissions tester sur: http://jsperf.com/days-in-month-head-to-head/5
Cela fonctionne sur la base de ma réponse de l'année bissextile ici: javascript pour trouver l'année bissextile cette réponse ici Vérification de l'année bissextile en utilisant des opérateurs au niveau du bit (vitesse incroyable) ainsi que la logique binaire suivante.
Une leçon rapide en mois binaires:
Si vous interprétez l'index des mois souhaités (Jan = 1) en binaire, vous remarquerez que les mois avec 31 jours ont soit le bit 3 effacé et le bit 0 défini, soit le bit 3 réglé et le bit 0 effacé.
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
Cela signifie que vous pouvez décaler la valeur de 3 places avec >> 3
, XOR les bits avec l'original ^ m
et voir si le résultat est 1
ou 0
à la position 0 en utilisant & 1
. Remarque: Il s'avère que +
c'est légèrement plus rapide que XOR ( ^
) et (m >> 3) + m
donne le même résultat dans le bit 0.
Résultats JSPerf : http://jsperf.com/days-in-month-perf-test/6