From 986fbc2e5146ec3df4eea445f0f5eb466c72a26d Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Mon, 11 Nov 2024 08:28:49 +0100 Subject: [PATCH] try two arg pools --- .../main/java/lucee/runtime/type/UDFImpl.java | 7 +--- .../runtime/type/scope/ArgumentImpl.java | 5 ++- .../runtime/type/scope/ScopeFactory.java | 40 ++++++++++--------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/lucee/runtime/type/UDFImpl.java b/core/src/main/java/lucee/runtime/type/UDFImpl.java index 7c80e5fc02..154018ac42 100755 --- a/core/src/main/java/lucee/runtime/type/UDFImpl.java +++ b/core/src/main/java/lucee/runtime/type/UDFImpl.java @@ -238,7 +238,7 @@ private Object getCachedWithin(PageContext pc) { private Object _callCachedWithin(PageContext pc, Collection.Key calledName, Object[] args, Struct values, boolean doIncludePath) throws PageException { PageContextImpl pci = (PageContextImpl) pc; - Argument newArgs = pci.getScopeFactory().getArgumentInstance(); + Argument newArgs = pci.getScopeFactory().getArgumentInstance(args); if (args != null) defineArguments(pci, getFunctionArguments(), args, newArgs); else defineArguments(pci, getFunctionArguments(), values, newArgs); @@ -304,10 +304,7 @@ private Object _call(PageContext pc, Collection.Key calledName, Object[] args, S PageContextImpl pci = (PageContextImpl) pc; boolean existingNewArgs = newArgs != null; - if (!existingNewArgs){ - if (args == null || args.length < 4) newArgs = pci.getScopeFactory().getArgumentInstance(); - else newArgs = pci.getScopeFactory().getArgumentInstance(args.length); - } + if (!existingNewArgs) newArgs = pci.getScopeFactory().getArgumentInstance(args); newArgs.setFunctionArgumentNames(properties.getArgumentsSet()); LocalImpl newLocal = pci.getScopeFactory().getLocalInstance(); diff --git a/core/src/main/java/lucee/runtime/type/scope/ArgumentImpl.java b/core/src/main/java/lucee/runtime/type/scope/ArgumentImpl.java index 38d6cb4d1c..295d38f807 100755 --- a/core/src/main/java/lucee/runtime/type/scope/ArgumentImpl.java +++ b/core/src/main/java/lucee/runtime/type/scope/ArgumentImpl.java @@ -64,13 +64,14 @@ public final class ArgumentImpl extends ScopeSupport implements Argument, ArrayP private boolean bind; private Set functionArgumentNames; // private boolean supportFunctionArguments; - + public static final int ARG_DEFAULT_INITIAL_CAPACITY = 4; + /** * constructor of the class */ public ArgumentImpl() { // super("arguments", SCOPE_ARGUMENTS, StructImpl.TYPE_LINKED, 4); - super("arguments", SCOPE_ARGUMENTS, StructImpl.TYPE_LINKED_NOT_SYNC, 4); + super("arguments", SCOPE_ARGUMENTS, StructImpl.TYPE_LINKED_NOT_SYNC, ARG_DEFAULT_INITIAL_CAPACITY); } public ArgumentImpl(int size) { diff --git a/core/src/main/java/lucee/runtime/type/scope/ScopeFactory.java b/core/src/main/java/lucee/runtime/type/scope/ScopeFactory.java index 948bb33382..138464a031 100755 --- a/core/src/main/java/lucee/runtime/type/scope/ScopeFactory.java +++ b/core/src/main/java/lucee/runtime/type/scope/ScopeFactory.java @@ -33,30 +33,26 @@ public final class ScopeFactory { int argumentCounter = 0; private final ConcurrentLinkedQueue arguments = new ConcurrentLinkedQueue(); + private final ConcurrentLinkedQueue argumentsLarge = new ConcurrentLinkedQueue(); private final ConcurrentLinkedQueue locals = new ConcurrentLinkedQueue(); /** * @return returns an Argument scope + * most arguments have only 0-3 keys */ - public Argument getArgumentInstance() { - Argument arg = arguments.poll(); - if (arg != null) { - return arg; + public Argument getArgumentInstance(Object[] args) { + if (args == null || args.length < ArgumentImpl.ARG_DEFAULT_INITIAL_CAPACITY){ + Argument arg = arguments.poll(); + if (arg != null) { + return arg; + } + return new ArgumentImpl(); } - //aprint.o("arguments new! " + arguments.size()); - return new ArgumentImpl(); - } - - /** - * @return returns an Argument scope - */ - public Argument getArgumentInstance(int size) { - Argument arg = arguments.poll(); + Argument arg = argumentsLarge.poll(); if (arg != null) { return arg; } - //aprint.o("arguments new! " + arguments.size()); - return size < 7 ? new ArgumentImpl(8) : new ArgumentImpl(16); + return new ArgumentImpl(ArgumentImpl.ARG_DEFAULT_INITIAL_CAPACITY * 2); } /** @@ -75,10 +71,16 @@ public LocalImpl getLocalInstance() { * @param argument recycle an Argument scope for reuse */ public void recycle(PageContext pc, Argument argument) { - if (arguments.size() >= MAX_SIZE || argument.isBind()) return; - //if (argument.size() > 0) aprint.o("arg: " + argument.size()); - argument.release(pc); - arguments.add(argument); + if (argument.isBind()) return; + if (argument.size() < ArgumentImpl.ARG_DEFAULT_INITIAL_CAPACITY ){ + if (arguments.size() >= MAX_SIZE ) return; + argument.release(pc); + arguments.add(argument); + } else { + if (argumentsLarge.size() >= MAX_SIZE ) return; + argument.release(pc); + argumentsLarge.add(argument); + } } /**