कंप्यूटर के संदर्भ में, new Date()और regular expressionसमाधान धीमे हैं! आप एक सुपर फास्ट (और सुपर गुप्त) एक लाइनर चाहते हैं, (यह मानते हुए एक कोशिश mमें है Jan=1प्रारूप)। मैं सर्वश्रेष्ठ प्रदर्शन पाने के लिए विभिन्न कोड परिवर्तनों की कोशिश करता रहता हूं।
मेरा वर्तमान सबसे तेज़ संस्करण:
इस संबंधित प्रश्न को देखने के बाद बिटवेट ऑपरेटर्स (अद्भुत गति) का उपयोग करके चेक करें और 25 और 15 मैजिक नंबर का प्रतिनिधित्व करने के बारे में पता लगाएं, मैं उत्तर के इस अनुकूलित हाइब्रिड के साथ आया हूं:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
बिट-शिफ्टिंग को देखते हुए यह स्पष्ट रूप से माना जाता है कि आपके mऔर yपैरामीटर दोनों पूर्णांक हैं, क्योंकि स्ट्रिंग्स के रूप में पासिंग संख्या अजीब परिणाम होगी।
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
JSPerf परिणाम: http://jsperf.com/days-in-month-head-to-head/5
किसी कारण से, (m+(m>>3)&1)से अधिक कुशल है (5546>>m&1)पर लगभग सभी ब्राउज़रों।
गति के लिए एकमात्र वास्तविक प्रतियोगिता @ गीतालैब से है, इसलिए मैंने परीक्षण करने के लिए एक हेड-टू-हेड JSPerf बनाया है: http://jsperf.com/days-in-month-head-to-head/5
यह मेरे लीप ईयर उत्तर के आधार पर यहां काम करता है: लीप ईयर खोजने के लिए जावास्क्रिप्ट इस उत्तर में यहां लीप ईयर की जांच बिटवाइज ऑपरेटरों (आश्चर्यजनक गति) के साथ-साथ निम्नलिखित द्विआधारी तर्क का उपयोग करके की गई है।
बाइनरी महीनों में एक त्वरित पाठ:
यदि आप बाइनरी में वांछित महीनों (जनवरी = 1) के सूचकांक की व्याख्या करते हैं, तो आप देखेंगे कि 31 दिनों के महीनों में बिट 3 स्पष्ट और बिट 0 सेट या बिट 3 सेट और बिट 0 स्पष्ट हैं।
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
इसका मतलब है कि आप मान के साथ 3 स्थानों को स्थानांतरित कर सकते हैं >> 3, मूल के साथ बिट्स को XOR कर सकते हैं ^ mऔर देखें कि क्या परिणाम है 1या 0 बिट स्थिति 0 का उपयोग कर रहा है & 1। नोट: यह +XOR ( ^) की तुलना में थोड़ा तेज है और (m >> 3) + mबिट 0 में समान परिणाम देता है।
JSPerf परिणाम : http://jsperf.com/days-in-month-perf-test/6