2012-02-23 12 views
7

मैं एक ऐसे वेब एप्लिकेशन पर काम करता हूं जो जेएसओएन डेटा को अपरकेस संपत्ति नामों के साथ प्राप्त करता है। मुझे उन संपत्ति नामों को लोअरकेस होने की आवश्यकता है, इसलिए मैं जेएसओएन ऑब्जेक्ट के माध्यम से लूप को दोबारा फ़ंक्शन का उपयोग कर रहा हूं और उन्हें लोअरकेस में बदल सकता हूं।जेएसओएन संपत्ति नामों को कम करता है जो जावास्क्रिप्ट कोड को अनुकूलित करता है

समस्या यह है कि मेरे JSON उत्तरों बहुत बड़े हो सकते हैं। मैं चाहता हूं कि समारोह अच्छी तरह से प्रदर्शन करे, भले ही इसे जेएसओएन को 60,000 संपत्ति नामों और घोंसले के विभिन्न स्तरों पर संसाधित करना पड़े।

lowercasing समारोह है:

FN = function (obj) 
{var ret = null; 
    if (typeof(obj) == "string" || typeof(obj) == "number") 
     return obj; 
    else if (obj.push) 
     ret = []; 
    else 
     ret = {}; 
    for (var key in obj) 
     ret[String(key).toLowerCase()] = FN(obj[key]); 
    return ret; 
}; 

और मैं यहाँ कुछ बेंच मार्किंग प्रदर्शन कर रहा हूँ: मेरे मशीन पर http://jsfiddle.net/emw89/7/

में ऊपर परीक्षण घड़ियों ~ 570ms पर।

क्या इस काम के प्रदर्शन में सुधार करने के लिए मैं कुछ भी कर सकता हूं?

संपादित करें: मैंने अपना आईई बंद कर दिया, आईई को दोबारा खोल दिया और फिर जेएसफ़ील्ड बेंचमार्क चलाया - अब यह मेरे लिए ~ 180ms पर आ रहा है। मेरी आईई बस कुछ दिनों तक सीधे तब तक खुली थी, इसलिए शायद यही खराब प्रदर्शन कर रहा था। किसी भी तरह से, मुझे अभी भी दिलचस्पी है यदि इस फ़ंक्शन को और अनुकूलित करने का कोई तरीका है। किसी भी समय जेएसओएन को प्रोसेस करने में अतिरिक्त समय खर्च करने से प्रत्येक AJAX अनुरोध के विलुप्त समय में सीधे जोड़ा जाता है।

+1

यह मेरे – JKirchartz

+0

78ms के लिए ~ 150 एमएस के आसपास पूर्ण होता है - IE9। I7 CPU के लिए Hurray। क्रोम लगभग 30% धीमा लगता है। सभी खर्च रिकर्सन में हैं, इसलिए मुझे यकीन नहीं है कि ऐसा कुछ और किया जा सकता है। –

+0

दो शब्द: [क्रोम फ्रेम] (http://code.google.com/intl/de-DE/chrome/chromeframe/) –

उत्तर

5
var lowerCache = {}; 

FN = function (obj) 
{ 
    if (typeof(obj) === "string" || typeof(obj) === "number") 
     return obj; 

     var l = obj.length; 
    if (l) { 
     l |= 0; 
     var result = []; 
     result.length = l; 
     for (var i = 0; i < l; i++) { 
      var newVal = obj[i]; 
      result[i] = typeof(newVal) === "string" ? newVal : FN(newVal); 
     } 
     return result; 
    } else { 
    var ret = {}; 
    for (var key in obj) { 

     var keyStr = typeof(key) === "string" ? key : String(key); 
     var newKey = lowerCache[keyStr]; 
     if (newKey === undefined) { 
      newKey = keyStr.toLowerCase(); 
      lowerCache[keyStr] = newKey; 
     } 

     var newVal = obj[key]; 
     ret[newKey] = typeof(newVal) === "string" ? newVal : FN(newVal); 
    } 
    return ret; 
    } 
}; 

100% तेज।

+1

एचएम ... यदि obj सरणी है तो यह कोड रिक्त सरणी लौटाता है, या क्या मुझे – komelgman

+0

@komelgman, गलत लगता है। फिक्स्ड। प्रदर्शन बनी हुई है। – usr

+0

यह विजेता की तरह दिखता है, लेकिन अगर कोई अन्य जादूगर कुछ के साथ आता है तो मैं थोड़ी देर के लिए अनुत्तरित प्रश्न छोड़ने जा रहा हूं। –

3

मैं इसे सरल रेगेक्स प्रतिस्थापन के साथ करूँगा।

  1. उपयोग JSON ऑब्जेक्ट

उदा में

  • Convert स्ट्रिंग फिर स्ट्रिंग
  • करने के लिए वस्तु कन्वर्ट करने के लिए एक ही नाम सिर्फ लोअरकेस साथ सभी गुण बदलें

    var obj = { SENAD: "meskin" }; 
    
    var str = JSON.stringify(obj); 
    
    function lCase(xxx) 
    { 
        pattern = /\"([a-z0-9_-]{0,})\"\:/gi; 
        return xxx.replace(pattern, function() { return arguments[0].toLowerCase() }); 
    } 
    str = lCase(str); 
    
    var newObj = JSON.parse(str); 
    alert(newObj.senad); 
    console.log(str); 
    

    मुझे आशा है कि इससे मदद मिलती है।

  • +0

    +1 JSON की जटिलता के आधार पर मुझे लगता है कि यह बेहतर हो सकता है। JSON पहले से ही एक स्ट्रिंग है, इसलिए आपको चरण # 1 छोड़ना चाहिए (जो कि अन्य विधि पर लाभ है)। – MrWhite

    1

    आप IE के साथ बड़े JSON ऑब्जेक्ट कार्रवाई कर रहे हैं, तो - मैं मात्रा में अपने json/सरणी प्रसंस्करण सलाह देते हैं (या किसी अन्य ब्राउज़र लेकिन आईई सबसे डमी थूक की संभावना है)।

    उस प्रक्रिया का अच्छा विवरण यहाँ http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html पाया जा सकता है ("पैदावार के लिए टाइमर पैटर्न" के लिए नीचे स्क्रॉल शीर्षक)

    संबंधित मुद्दे