From 381e7963781b2a74b19815522906bdc7bfa509da Mon Sep 17 00:00:00 2001 From: Fabian Pichler Date: Sun, 26 Jun 2022 08:36:45 +0200 Subject: [PATCH 1/5] implement server based benchmarking --- celements-performance/pom.xml | 47 +++++++++++ .../celements/performance/BenchmarkRole.java | 18 ++++ .../performance/BenchmarkScriptService.java | 38 +++++++++ .../performance/BenchmarkService.java | 82 +++++++++++++++++++ .../src/main/resources/META-INF/MANIFEST.MF | 3 + .../main/resources/META-INF/components.txt | 2 + 6 files changed, 190 insertions(+) create mode 100644 celements-performance/pom.xml create mode 100644 celements-performance/src/main/java/com/celements/performance/BenchmarkRole.java create mode 100644 celements-performance/src/main/java/com/celements/performance/BenchmarkScriptService.java create mode 100644 celements-performance/src/main/java/com/celements/performance/BenchmarkService.java create mode 100644 celements-performance/src/main/resources/META-INF/MANIFEST.MF create mode 100644 celements-performance/src/main/resources/META-INF/components.txt diff --git a/celements-performance/pom.xml b/celements-performance/pom.xml new file mode 100644 index 000000000..e7a83c19a --- /dev/null +++ b/celements-performance/pom.xml @@ -0,0 +1,47 @@ + + + + + com.celements + celements + 5.5 + + 4.0.0 + celements-performance + 5.0-SNAPSHOT + Celements Performance metrics + + + com.celements + celements-model + 5.4 + provided + + + + scm:git:git@github.com:celements/celements-xwiki.git + scm:git:git@github.com:celements/celements-xwiki.git + https://github.com/celements/celements-xwiki + HEAD + + diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkRole.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkRole.java new file mode 100644 index 000000000..9b55bb9f5 --- /dev/null +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkRole.java @@ -0,0 +1,18 @@ +package com.celements.performance; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import org.xwiki.component.annotation.ComponentRole; + +@ComponentRole +public interface BenchmarkRole { + + void bench(@NotEmpty String label); + + void startBench(); + + @NotNull + String println(boolean visible); + +} diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkScriptService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkScriptService.java new file mode 100644 index 000000000..02ae83724 --- /dev/null +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkScriptService.java @@ -0,0 +1,38 @@ +package com.celements.performance; + +import org.xwiki.component.annotation.Component; +import org.xwiki.component.annotation.Requirement; +import org.xwiki.script.service.ScriptService; + +import com.celements.model.context.ModelContext; + +@Component("bench") +public class BenchmarkScriptService implements ScriptService { + + @Requirement + private ModelContext context; + + @Requirement + private BenchmarkRole benchSrv; + + public String benchAndPrint(String label) { + return benchAndPrint(label, false); + } + + public void bench(String label) { + benchSrv.bench(label); + } + + public String benchAndPrint(String label, boolean visible) { + benchSrv.bench(label); + boolean requestVisible = context.getRequest().toJavaUtil() + .map(request -> "true".equals(request.getParameter("showBenchmark"))) + .orElse(false); + return benchSrv.println(visible || requestVisible); + } + + public void startBench() { + benchSrv.startBench(); + } + +} diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java new file mode 100644 index 000000000..b936d04f6 --- /dev/null +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java @@ -0,0 +1,82 @@ +package com.celements.performance; + +import static com.google.common.base.Preconditions.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.stream.Collectors; + +import org.xwiki.component.annotation.Component; +import org.xwiki.component.annotation.Requirement; +import org.xwiki.context.Execution; + +import com.google.common.base.Strings; + +@Component +public class BenchmarkService implements BenchmarkRole { + + private static final String BENCH_LAST_TIME = "bench_lastTime"; + + private static final String BENCH_START_TIME = "bench_startTime"; + + private static final String CEL_BENCHMARK_VAL_PREFIX = "CEL_BENCHMARK_"; + + private static final String CEL_BENCHMARK_OUT_STRINGS = CEL_BENCHMARK_VAL_PREFIX + + "benchOutStrings"; + + @Requirement + Execution execution; + + private long getContextLongValue(String name) { + return (long) execution.getContext().getProperty(CEL_BENCHMARK_VAL_PREFIX + name); + } + + private void setContextLongValue(String name, long value) { + execution.getContext().setProperty(CEL_BENCHMARK_VAL_PREFIX + name, value); + } + + @SuppressWarnings("unchecked") + private ArrayList getBenchOutStringArray() { + ArrayList benchOutStringArray; + if (execution.getContext().getProperty(CEL_BENCHMARK_OUT_STRINGS) == null) { + benchOutStringArray = new ArrayList<>(); + execution.getContext().setProperty(CEL_BENCHMARK_OUT_STRINGS, benchOutStringArray); + } else { + benchOutStringArray = (ArrayList) execution.getContext() + .getProperty(CEL_BENCHMARK_OUT_STRINGS); + } + return benchOutStringArray; + } + + @Override + public void bench(String label) { + checkArgument(!Strings.isNullOrEmpty(label)); + long currTime = new Date().getTime(); + long benchLastTime = getContextLongValue(BENCH_LAST_TIME); + long benchStartTime = getContextLongValue(BENCH_START_TIME); + double totalTime = (currTime - benchStartTime) / 1000.0; + double time = (currTime - benchLastTime) / 1000.0; + setContextLongValue(BENCH_LAST_TIME, benchLastTime); + getBenchOutStringArray() + .add("bench '" + label + "' — in " + time + "s — total " + totalTime + + "s"); + } + + @Override + public void startBench() { + long benchStartTime = new Date().getTime(); + setContextLongValue(BENCH_START_TIME, benchStartTime); + setContextLongValue(BENCH_LAST_TIME, benchStartTime); + } + + @Override + public String println(boolean visible) { + String outStr = getBenchOutStringArray().stream() + .collect(Collectors.joining("\n")); + if (!visible) { + outStr = ""; + } + return outStr; + } + +} diff --git a/celements-performance/src/main/resources/META-INF/MANIFEST.MF b/celements-performance/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..5e9495128 --- /dev/null +++ b/celements-performance/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/celements-performance/src/main/resources/META-INF/components.txt b/celements-performance/src/main/resources/META-INF/components.txt new file mode 100644 index 000000000..1a12d83ca --- /dev/null +++ b/celements-performance/src/main/resources/META-INF/components.txt @@ -0,0 +1,2 @@ +com.celements.performance.BenchmarkService +com.celements.performance.BenchmarkScriptService From a3d0f5b010ae9494501d85146d4ed9017856b49e Mon Sep 17 00:00:00 2001 From: Fabian Pichler Date: Sun, 26 Jun 2022 09:07:19 +0200 Subject: [PATCH 2/5] add line-break after comment --- .../main/java/com/celements/performance/BenchmarkService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java index b936d04f6..21fb75600 100644 --- a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java @@ -74,7 +74,7 @@ public String println(boolean visible) { String outStr = getBenchOutStringArray().stream() .collect(Collectors.joining("\n")); if (!visible) { - outStr = ""; + outStr = "\n"; } return outStr; } From c15fb504e8d4c27a6621c6dbb043a0b78800d9a5 Mon Sep 17 00:00:00 2001 From: Fabian Pichler Date: Sun, 26 Jun 2022 09:09:46 +0200 Subject: [PATCH 3/5] clear outString array after print --- .../main/java/com/celements/performance/BenchmarkService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java index 21fb75600..2394e3256 100644 --- a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java @@ -73,6 +73,7 @@ public void startBench() { public String println(boolean visible) { String outStr = getBenchOutStringArray().stream() .collect(Collectors.joining("\n")); + getBenchOutStringArray().clear(); if (!visible) { outStr = "\n"; } From c42167ca07fa553c5d240bee6d5f5b51e24ca6c5 Mon Sep 17 00:00:00 2001 From: Fabian Pichler Date: Mon, 27 Jun 2022 01:42:59 +0200 Subject: [PATCH 4/5] correct updating BENCH_LAST_TIME --- .../java/com/celements/performance/BenchmarkService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java index 2394e3256..f83ac0577 100644 --- a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java @@ -52,11 +52,9 @@ private ArrayList getBenchOutStringArray() { public void bench(String label) { checkArgument(!Strings.isNullOrEmpty(label)); long currTime = new Date().getTime(); - long benchLastTime = getContextLongValue(BENCH_LAST_TIME); - long benchStartTime = getContextLongValue(BENCH_START_TIME); - double totalTime = (currTime - benchStartTime) / 1000.0; - double time = (currTime - benchLastTime) / 1000.0; - setContextLongValue(BENCH_LAST_TIME, benchLastTime); + double totalTime = (currTime - getContextLongValue(BENCH_START_TIME)) / 1000.0; + double time = (currTime - getContextLongValue(BENCH_LAST_TIME)) / 1000.0; + setContextLongValue(BENCH_LAST_TIME, currTime); getBenchOutStringArray() .add("bench '" + label + "' — in " + time + "s — total " + totalTime + "s"); From 630f235ab590d26df883cb9eb6a5e1fcca114a72 Mon Sep 17 00:00:00 2001 From: Fabian Pichler Date: Mon, 27 Jun 2022 02:13:15 +0200 Subject: [PATCH 5/5] add isStarted check --- .../performance/BenchmarkService.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java index f83ac0577..49905ae80 100644 --- a/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java +++ b/celements-performance/src/main/java/com/celements/performance/BenchmarkService.java @@ -6,6 +6,8 @@ import java.util.Date; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xwiki.component.annotation.Component; import org.xwiki.component.annotation.Requirement; import org.xwiki.context.Execution; @@ -15,6 +17,8 @@ @Component public class BenchmarkService implements BenchmarkRole { + private static final Logger LOGGER = LoggerFactory.getLogger(BenchmarkService.class); + private static final String BENCH_LAST_TIME = "bench_lastTime"; private static final String BENCH_START_TIME = "bench_startTime"; @@ -27,8 +31,12 @@ public class BenchmarkService implements BenchmarkRole { @Requirement Execution execution; - private long getContextLongValue(String name) { - return (long) execution.getContext().getProperty(CEL_BENCHMARK_VAL_PREFIX + name); + private boolean isBenchStarted() { + return getContextLongValue(BENCH_START_TIME) != null; + } + + private Long getContextLongValue(String name) { + return (Long) execution.getContext().getProperty(CEL_BENCHMARK_VAL_PREFIX + name); } private void setContextLongValue(String name, long value) { @@ -51,13 +59,17 @@ private ArrayList getBenchOutStringArray() { @Override public void bench(String label) { checkArgument(!Strings.isNullOrEmpty(label)); - long currTime = new Date().getTime(); - double totalTime = (currTime - getContextLongValue(BENCH_START_TIME)) / 1000.0; - double time = (currTime - getContextLongValue(BENCH_LAST_TIME)) / 1000.0; - setContextLongValue(BENCH_LAST_TIME, currTime); - getBenchOutStringArray() - .add("bench '" + label + "' — in " + time + "s — total " + totalTime - + "s"); + if (isBenchStarted()) { + long currTime = new Date().getTime(); + double totalTime = (currTime - getContextLongValue(BENCH_START_TIME)) / 1000.0; + double time = (currTime - getContextLongValue(BENCH_LAST_TIME)) / 1000.0; + setContextLongValue(BENCH_LAST_TIME, currTime); + getBenchOutStringArray() + .add("bench '" + label + "' — in " + time + "s — total " + totalTime + + "s"); + } else { + LOGGER.info("bench called without startBench. Skipping."); + } } @Override