From 1a3140966c761d13e70d4bb5aee3aa26c12f33ab Mon Sep 17 00:00:00 2001 From: James Yuzawa Date: Tue, 17 Jun 2025 18:24:29 -0400 Subject: [PATCH] optimize EvaluatorWithHooks --- .../sdk/server/EvaluatorWithHooks.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/EvaluatorWithHooks.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/EvaluatorWithHooks.java index fc6e5e7..aada825 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/EvaluatorWithHooks.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/EvaluatorWithHooks.java @@ -37,16 +37,18 @@ class EvaluatorWithHooks implements EvaluatorInterface { public EvalResultAndFlag evalAndFlag(String method, String featureKey, LDContext context, LDValue defaultValue, LDValueType requireType, EvaluationOptions options) { // Each hook will have an opportunity to provide series data to carry along to later stages. This list // is to track that data. - List seriesDataList = new ArrayList<>(hooks.size()); + int size = hooks.size(); + List seriesDataList = new ArrayList<>(size); EvaluationSeriesContext seriesContext = new EvaluationSeriesContext(method, featureKey, context, defaultValue); - for (int i = 0; i < hooks.size(); i++) { + Map emptyMap = Collections.emptyMap(); + for (int i = 0; i < size; i++) { Hook currentHook = hooks.get(i); try { - Map seriesData = currentHook.beforeEvaluation(seriesContext, Collections.emptyMap()); - seriesDataList.add(Collections.unmodifiableMap(seriesData)); // make data immutable + Map seriesData = currentHook.beforeEvaluation(seriesContext, emptyMap); + seriesDataList.add(seriesData.isEmpty() ? emptyMap : Collections.unmodifiableMap(seriesData)); // make data immutable } catch (Exception e) { - seriesDataList.add(Collections.emptyMap()); // since the provided hook failed to execute, we default the series data to an empty map in this case + seriesDataList.add(emptyMap); // since the provided hook failed to execute, we default the series data to an empty map in this case logger.error("During evaluation of flag \"{}\". Stage \"BeforeEvaluation\" of hook \"{}\" reported error: {}", featureKey, currentHook.getMetadata().getName(), e.toString()); } } @@ -54,7 +56,7 @@ public EvalResultAndFlag evalAndFlag(String method, String featureKey, LDContext EvalResultAndFlag result = underlyingEvaluator.evalAndFlag(method, featureKey, context, defaultValue, requireType, options); // Invoke hooks in reverse order and give them back the series data they gave us. - for (int i = hooks.size() - 1; i >= 0; i--) { + for (int i = size - 1; i >= 0; i--) { Hook currentHook = hooks.get(i); try { currentHook.afterEvaluation(seriesContext, seriesDataList.get(i), result.getResult().getAnyType());