Mercurial > hg > openjdk > jdk9 > nashorn
changeset 1756:ee77c6b3713a jdk-9+131
8162955: Activate anonymous class loading for small sources
Reviewed-by: sundar
author | hannesw |
---|---|
date | Mon, 08 Aug 2016 12:51:44 +0200 |
parents | 9978e882acba |
children | cdd9245015bf 3487086f145a |
files | docs/DEVELOPER_README src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java |
diffstat | 3 files changed, 24 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/docs/DEVELOPER_README Thu Aug 04 17:49:29 2016 +0000 +++ b/docs/DEVELOPER_README Mon Aug 08 12:51:44 2016 +0200 @@ -302,6 +302,16 @@ See -Dnashorn.debug for methods to access the event queue. The default value is 1024. +SYSTEM PROPERTY: -Dnashorn.anonymous.classes.threshold=<value> + +Nashorn can use anonymous classes for loading compiled scripts, depending +on the --anonymous-classes=[auto|true|false] option. Anonymous classes load +faster, but the loaded classes get less optimization applied to them and +therefore usually run slower. In the default "auto" setting, scripts are +loaded as anonymous classes if the script size does not exceed 512 bytes. +The above system property allows to set this threshold to a user defined +value. + =============== 2. The loggers. ===============
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu Aug 04 17:49:29 2016 +0000 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Mon Aug 08 12:51:44 2016 +0200 @@ -1502,7 +1502,7 @@ final URL url = source.getURL(); final CodeSource cs = new CodeSource(url, (CodeSigner[])null); final CodeInstaller installer; - if (!env.useAnonymousClasses(isEval) || env._persistent_cache || !env._lazy_compilation) { + if (!env.useAnonymousClasses(source.getLength()) || env._persistent_cache || !env._lazy_compilation) { // Persistent code cache and eager compilation preclude use of VM anonymous classes final ScriptLoader loader = env._loader_per_compile ? createNewLoader() : scriptLoader; installer = new NamedContextCodeInstaller(this, cs, loader);
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Thu Aug 04 17:49:29 2016 +0000 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Mon Aug 08 12:51:44 2016 +0200 @@ -222,7 +222,7 @@ /** Timing */ public final Timing _timing; - /** Whether to use anonymous classes. See {@link #useAnonymousClasses(boolean)}. */ + /** Whether to use anonymous classes. See {@link #useAnonymousClasses(int)}. */ private final AnonymousClasses _anonymousClasses; private enum AnonymousClasses { AUTO, @@ -230,6 +230,12 @@ ON } + /** Size threshold up to which we use anonymous classes in {@link AnonymousClasses#AUTO} setting */ + private final int _anonymous_classes_threshold; + + /** Default value for anonymous class threshold */ + private final static int DEFAULT_ANON_CLASS_THRESHOLD = 512; + /** * Constructor * @@ -327,6 +333,8 @@ throw new RuntimeException("Unsupported value for anonymous classes: " + anonClasses); } + this._anonymous_classes_threshold = Options.getIntProperty( + "nashorn.anonymous.classes.threshold", DEFAULT_ANON_CLASS_THRESHOLD); final String language = options.getString("language"); if (language == null || language.equals("es5")) { @@ -462,11 +470,12 @@ /** * Returns true if compilation should use anonymous classes. - * @param isEval true if compilation is an eval call. + * @param sourceLength length of source being compiled. * @return true if anonymous classes should be used */ - public boolean useAnonymousClasses(final boolean isEval) { - return _anonymousClasses == AnonymousClasses.ON || (_anonymousClasses == AnonymousClasses.AUTO && isEval); + public boolean useAnonymousClasses(final int sourceLength) { + return _anonymousClasses == AnonymousClasses.ON + || (_anonymousClasses == AnonymousClasses.AUTO && sourceLength <= _anonymous_classes_threshold); } }