5

मैं मानता हूं कि मैंने एक सवाल पूछा है कि क्यों क्लोजर कंपाइलर कुछ कोड को छोटा नहीं करता है जो पहले कुछ दिनों पहले पहली बार कम दिखता है, लेकिन यह कारण इस मामले में लागू नहीं है और मुझे सच में यकीन नहीं है कि यह क्यों नहीं है ' यहाँ छोटा नहीं है।क्लोजर कंपाइलर - क्या एक ++> = 3 ++ ए> 3 हो सकता है?

क्या कोड मैं है:

var a = 0; 
function b() { 
    return a++ >= 3; 
} 

अब पूर्व बढ़ाने और बाद incrementing है। a++ रिटर्न a और तो यह वेतन वृद्धि, ++a पहले वेतन वृद्धि a और तो यह रिटर्न - अंतर वापसी मान है।

क्या यह करने के लिए नीचे आता है कि मेरे कोड (सफेद स्थान को हटाने की अनदेखी) के लिए छोटा किया जा सकता है:

var a = 0; 
function b() { 
    return ++a > 3; 
} 

हालांकि, बंद संकलक बदल (या पहचान) यह करने के लिए प्रतीत नहीं होता।

मेरा प्रश्न इसलिए है: ++a > के किन दुष्प्रभाव a++ >= के बजाय उपयोग किए जाने पर क्या दुष्प्रभाव हो सकते हैं?

+0

आप ऐसा क्यों करना चाहते हैं? मैं नहीं देख सकता कि यह किसी भी तरह से प्रदर्शन में सुधार कैसे करेगा। –

+0

प्रदर्शन की वजह से नहीं, लेकिन कोड की लंबाई के कारण। क्लोजर कंपाइलर व्हाइटस्पेस को हटाकर कोड को छोटा करने के लिए है और बहुत कुछ है, इसलिए 'ए ++> = 3' को' ++ ए> 3' तक छोटा किया जा सकता है। बहुत रोमांचक नहीं है लेकिन मैं बस सोच रहा था। – pimvdb

+3

आपको 2 स्थितियों को पूरा करने की आवश्यकता है और लाभ बहुत कम है इसलिए संभवतः उन्होंने अपना समय बर्बाद नहीं किया है या अधिक महत्वपूर्ण चीजों पर ध्यान केंद्रित नहीं किया है ... – fazo

उत्तर

7

इस निर्माण के लिए एक विशेष एज-केस है (लेकिन 3 के लिए नहीं)।

ऐसा इसलिए होता है क्योंकि जावास्क्रिप्ट आईईईई -754 फ्लोट-पॉइंट 64-बिट युगल के रूप में स्टोर करता है और "केवल" के पास 2^53 तक "सटीक" पूर्णांक-प्रतिनिधित्व की गारंटी है (हालांकि कार्यान्वयन के पास ली-वे हो सकता है उच्च सीमा, मुझे नहीं पता)।

यह फ़ायरफ़ॉक्स 4 पर है:

a = 2e53 
a++ >= 2e53 // true 

a = 2e53 
++a > 2e53 // false 

रियल सवाल क्या लाभ महसूस किया इस तरह के एक बहुत विशेष परिवर्तन होता है? : -0

हैप्पी कोडिंग।

+0

फायरबग में, फ़ायरफ़ॉक्स 3.6 '(संख्या.एमएक्स_वीआरएल + 1) === संख्या.एमएक्स_वीएमएल' सच है –

+0

क्रोम में भी, हालांकि 'नंबर.मैक्स_वीआरएल + 1e308 === इन्फिनिटी'। ऐसा लगता है कि क्रोम 'ई + 308' तक जा रहा है। – pimvdb

1

अपने सभी किनारे की स्थितियों की जांच क्यों न करें?

function b(a) { 
    return a++ >= 3; 
} 

function b2(a) { 
    return ++a > 3; 
} 

console.log(b(2) === b2(2)) 
console.log(b(3) === b2(3)) 
console.log(b(4) === b2(4)) 

उत्पादन प्रत्येक मामले में true है।

+0

हां, तो मेरा वास्तविक सवाल यह था कि क्लोजर कंपाइलर इसे क्यों अनदेखा करता है। – pimvdb

2

यह इस आकार अनुकूलन लागू करने के लिए करता है, तो सही-संकार्य (अपने उदाहरण में 3) एक निरंतर पूर्णांक रेंज [-2 , 2 ] में है सुरक्षित है। किसी भी अन्य मामले में (उदाहरण के लिए, यदि दाएं ऑपरेंड आंशिक या बहुत बड़ा है), यह सुरक्षित नहीं है।

मैं कल्पना कर सकते हैं कि बंद के इस अनुकूलन को लागू नहीं करता है:

  • यह सुनिश्चित करना है कि अनुकूलन के लिए सुरक्षित है जाँच का एक बहुत आवश्यकता है,
  • यह केवल बहुत विशिष्ट परिस्थितियों है कि शायद डॉन में लागू होता है ' टी अक्सर आते हैं, और
  • यह केवल एक ही चरित्र बचाता है, जो मुश्किल से परेशान नहीं लगता है।
संबंधित मुद्दे