Can't get Multithreaded Nashorn uses to Scale

Jim Laskey (Oracle) james.laskey at oracle.com
Tue Dec 6 13:07:57 UTC 2016


Jesus,

Probably the most informative information is in this blog.

https://blogs.oracle.com/nashorn/entry/nashorn_multi_threading_and_mt <https://blogs.oracle.com/nashorn/entry/nashorn_multi_threading_and_mt>

This example uses Executors but threads would work as well.

I did a talk that looked at different methods to max out multithreading performance.  A new engine per thread is the worst case.  A new context per thread does much better.  A new global per thread is the best while remaining thread safe.

Cheers,

— Jim





> On Dec 6, 2016, at 8:45 AM, Jesus Luzon <jluzon at riotgames.com> wrote:
> 
> Hey folks,
> 
> I've tried many different ways of using Nashorn multithreaded based on what
> I've found on the internet and I still can't get a single one to scale.
> Even the most naive method of making many script engines with my script
> tends to bottleneck itself when I have more than 10 threads invoking
> functions.
> 
> I'm using the following code to compile my script and
> invocable.invokeFunction("transform", input) to execute:
> 
>>    static Invocable generateInvocable(String script) throws
>> ScriptException {
>>        ScriptEngineManager manager = new ScriptEngineManager();
>>        ScriptEngine engine =
>> manager.getEngineByName(JAVASCRIPT_ENGINE_NAME);
>>        Compilable compilable = (Compilable) engine;
>>        final CompiledScript compiled = compilable.compile(script);
>>        compiled.eval();
>>        return (Invocable) engine;
>>    }
> 
> 
> The script I'm compiling is:
> 
>>        String script = "function transform(input) {" +
>>                "var result = JSON.parse(input);" +
>>                "response = {};\n" +
>>                "for (var i = 0; i < result.length; i++) {\n" +
>>                "    var summoner = {};\n" +
>>                "    summoner.id = result[i].id;\n" +
>>                "    summoner.name = result[i].name;\n" +
>>                "    summoner.profileIconId = result[i].profileIconId;\n" +
>>                "    summoner.revisionDate = result[i].revisionDate;\n" +
>>                "    summoner.summonerLevel = result[i].level;\n" +
>>                "    response[summoner.id] = summoner;\n" +
>>                "}\n" +
>>                "result = response;" +
>>                "return JSON.stringify(result);" +
>>                "};";
> 
> 
> I've also tried other more scaleable ways to work with scripts
> concurrently, but given that this is the most naive method where everything
> is brand new and I still get slowness calling them concurrently I fear that
> maybe I'm overlooking something extremely basic on my code.
> 
> Thanks.
> -Jesus Luzon



More information about the nashorn-dev mailing list