Many developers know that a new JavaScript engine called Nashorn was introduced in Java 8 as a replacement for the aging Rhino engine. Recently, I (finally) had the opportunity to make use of the capability.
The project is a custom NiFi processor that utilizes a custom configuration-based data transformation engine. The configurations make heavy use of JavaScript-based mappings to move and munge fields from a source schema into a target schema. Our initial testing revealed rather lackluster performance. JProfiler indicated that the hotspot was the script engine’s eval() method, which really wasn’t that helpful since I already knew that script execution was going to be the long pole in the tent.
It turned out that I had missed an opportunity during the initial implementation. The Nashorn script engine implements Compilable, a functional interface that allows you to compile your script.
@Test public void testWithCompilation() throws Exception { ScriptEngine engine = mgr.getEngineByName("nashorn"); CompiledScript compiled = ((Compilable) engine).compile("value = 'junit';"); for (int i = 0; i < 10000; i++) { Bindings bindings = engine.createBindings(); compiled.eval(bindings); Object result = bindings.get("value"); Assert.assertEquals(result, "junit"); } } @Test public void testWithoutCompilation() throws Exception { for (int i = 0; i < 10000; i++) { ScriptEngine engine = mgr.getEngineByName("nashorn"); engine.eval("value = 'junit';"); Object result = engine.get("value"); Assert.assertEquals(result, "junit"); } }
As you can see, the difference is substantial across a test of 10,000 invocations. A batch size of a few million records is pretty ordinary for the system that uses this component, so this represents a huge time savings.
I should also mention that the script engine is thread safe. For concurrent use, each thread simply needs to obtain a fresh bindings instance from the engine as shown in the code above.
I get the impression that Nashorn may be an underutilized feature in the JDK. However, script-based extensibility in an application can be quite valuable in certain scenarios. Nashorn is worth keeping in mind for your future projects.