2012-08-31 11 views
10

मैं अपने ऐप में कुछ क्लाइंट कोड का मूल्यांकन करने के लिए अपने ऐप में स्क्रिप्टइंजिन का उपयोग कर रहा हूं। समस्या यह है कि यह पर्याप्त प्रदर्शन नहीं है और मुझे निष्पादन के समय में सुधार करने के लिए उपाय करने की आवश्यकता है। वर्तमान में, इसमें 1463ms (औसत 300ms है) को एक बेहद सरल स्क्रिप्ट को निकालने में लग सकता है जो मूल रूप से यूआरएल में पैरामीटर प्रतिस्थापन है।जावा स्क्रिप्टइंजिन (ग्रोवी) के साथ, इसे और अधिक प्रदर्शन करने के लिए कैसे?

मैं स्क्रिप्टिंग क्षमता खोए बिना इस प्रदर्शन को बेहतर बनाने के लिए सरल रणनीतियों की तलाश में हूं।

मेरी पहली बार यह स्क्रिप्टइंजिन ऑब्जेक्ट को पूल करने और इसे पुन: उपयोग करने के लिए सोचा था। मैं कल्पना में देखता हूं कि इसका पुन: उपयोग किया जाना है, लेकिन मुझे वास्तव में ऐसा करने वाले किसी भी उदाहरण का कोई उदाहरण नहीं मिला है।

कोई विचार?

ScriptEngineManager factory = new ScriptEngineManager(); 
GroovyScriptEngineImpl engine = (GroovyScriptEngineImpl)factory.getEngineByName("groovy"); 
engine.put("state", state; 
engine.put("zipcode", zip); 
engine.put("url", locationAwareAd.getLocationData().getGeneratedUrl()); 
url = (String) engine.eval(urlGeneratorScript); 

किसी भी प्रतिक्रिया की सराहना की जाएगी: यहाँ मेरी कोड है!

उत्तर

12

सबसे अधिक संभावना यह है कि इंजन वास्तव में स्क्रिप्ट का मूल्यांकन हर बार eval() कहा जाता है। इसके बजाय, आप Compilable इंटरफ़ेस के माध्यम से प्रीकंपलाइज्ड स्क्रिप्ट का पुनः उपयोग कर सकते हैं।

// move this into initialization part so that you do not call this every time. 
    ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("groovy"); 
    CompiledScript script = ((Compilable) engine).compile(urlGeneratorScript); 

    //the code below will use the precompiled script code 
    Bindings bindings = new Bindings(); 
    bindings.put("state", state; 
    bindings.put("zipcode", zip); 
    bindings.put("url", locationAwareAd.getLocationData().getGeneratedUrl()); 
    url = script.eval(bindings); 

Fwiw, तुम भी, फ़ाइल टाइमस्टैम्प जांच लागू कर सकते हैं, तो स्क्रिप्ट बदली हुई कॉल संकलन (..) फिर से है।

+0

ओह, यह एक अच्छा विचार है! मैं आगे बढ़ गया हूं और स्क्रिप्टइंजिन को कॉमन्स-पूल के साथ पूल किया है। बीमार अब आगे बढ़ो और precompile। धन्यवाद! – matsientst

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