In termini informatici, new Date()
e le regular expression
soluzioni sono lente! Se vuoi un one-liner super veloce (e super criptico), prova questo (supponendo che m
sia dentroJan=1
formato). Continuo a provare diverse modifiche al codice per ottenere le migliori prestazioni.
La mia attuale versione più veloce :
Dopo aver esaminato questa domanda correlata Verifica dell'anno bisestile utilizzando operatori bit per bit (velocità incredibile) e scoperto cosa rappresentava il numero magico 25 e 15, ho trovato questo ibrido ottimizzato di risposte:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Dato lo spostamento dei bit, ciò presuppone ovviamente che il tuo m
&y
parametri siano entrambi numeri interi, poiché il passaggio di numeri come stringhe comporterebbe risultati strani.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Risultati JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Per qualche motivo, (m+(m>>3)&1)
è più efficiente rispetto (5546>>m&1)
a quasi tutti i browser.
L'unica vera competizione per la velocità è di @GitaarLab, quindi ho creato un JSPerf testa a testa su cui testare: http://jsperf.com/days-in-month-head-to-head/5
Funziona in base alla mia risposta dell'anno bisestile qui: javascript per trovare l'anno bisestile questa risposta qui Controllo anno bisestile utilizzando operatori bit a bit (velocità incredibile) e la seguente logica binaria.
Una breve lezione in mesi binari:
Se si interpreta l'indice dei mesi desiderati (Jan = 1) in binario, si noterà che i mesi con 31 giorni hanno bit 3 azzerato e bit 0 impostato, oppure bit 3 impostato e bit 0 azzerato.
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
Ciò significa che puoi spostare il valore di 3 posizioni con >> 3
, XOR i bit con l'originale ^ m
e vedere se il risultato è 1
o 0
nella posizione di bit 0 usando & 1
. Nota: risulta +
leggermente più veloce di XOR ( ^
) e (m >> 3) + m
fornisce lo stesso risultato nel bit 0.
Risultati JSPerf : http://jsperf.com/days-in-month-perf-test/6