The way nashorn integrates user plugged Bindings is by installing __noSuchProperty__ and __noSuchMethod__ special hooks in Nashorn's Global script object. But, when you set variable via ScriptEngine.put or put to default ENGINE_SCOPE Bindings instance (which is of type ScriptObjectMirror), you are actually creating a JS global variable durectly. i.e., no __noSuchProperty__ hook needed in that case.

One small adjustment you can do in your script:

var intArray = ints; // gets ints from script "context"'s Bindings - either ENGINE_SCOPE or GLOBAL_SCOPE - perhaps SimpleBindings var filter = 0;var i = intArray.length;while(i--) { if (+intArray[i] > 500) { filter++; }}

The above script avoids fetching "ints" inside loop 100 million times -- just fetches "ints" once outside the loop. The above should perform similar to your first case.

Hope this helps,
-Sundar

On Friday 02 August 2013 03:22 AM, Rod Nim wrote:
Hi list,
I'm using Nashorn via ScriptEngineManager, which constructs me a ScriptEngine 
with an ENGINE_SCOPE Bindings of type 
jdk.nashorn.api.scripting.ScriptObjectMirror.
I put an 100 million random 0 to 1000, int array into that context and iterate 
it in a loop in JS, which takes 3700ms.
var filter = 0;var i = ints.length;while(i--) {    if (+ints[i] > 500) {        
filter++;    }}
If I set my own bindings though, via ScriptEngine.setBindings():
Bindings b = new SimpleBindings();b.put("ints", ints);engine.setBindings(b, 
ScriptContext.ENGINE_SCOPE);
The exact same piece of JS code now takes 8600ms to execute. Twice as long. And 
SimpleBindings is pretty simple, just a delegation to HashMap.
Is there some trick I'm missing?
Thanks for the help!
Rod



                                        

Reply via email to