मैं this Codewars challenge का प्रयास कर रहा था और समस्या में किसी संख्या के विभाजक ढूंढने और फिर इन divisors वर्ग के योग की गणना शामिल है। मुझे इस समस्या के दो दृष्टिकोण मिले।जावास्क्रिप्ट प्रदर्शन:() बनाम फॉर-लूप
पहले दृष्टिकोण finding the sum of all divisors के बारे में एक और Stackoverflow प्रश्नों पर आधारित है और पहली बार में चालाक लगता है:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
दूसरा दृष्टिकोण मैं एक साधारण के लिए लूप उपयोग कर रहा था इस्तेमाल किया:
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
अब मैं ध्यान दिया कि पहला दृष्टिकोण दूसरे की तुलना में काफी धीमी है और एक त्वरित jsperf test इसकी पुष्टि करता है।
मेरे प्रश्न हैं: पहला दृष्टिकोण इतना धीमा क्यों है और उत्पादन कोड में कौन सा दृष्टिकोण बेहतर है?
कोडेवार्स पर मुझे पता है कि कई चुनौतियों के लिए समान सरणी विधियों का उपयोग करके चालाक एक-लाइन समाधान हैं। शुरुआत के रूप में, क्या ऐसे समाधानों को फॉर-लूप की तुलना में बेहतर अभ्यास माना जा सकता है, भले ही प्रदर्शन खराब हो?
आप कोड को देखो, तो पहले एक एक निर्माता दोहराता दोहराता दोहराता का उपयोग करता है, तो प्रसार करने के लिए है, तो कुंजी प्राप्त करने के लिए, तो काट करने के लिए ... दूसरा एक बार फिर से ... – adeneo
मैंने इसके बारे में नहीं सोचा था, लेकिन अब यह बहुत स्पष्ट लगता है। धन्यवाद! –