Replace AOP-driven based time profiler with a simpler one based on lambdas

This commit is contained in:
2021-02-15 11:48:23 +01:00
parent f75d56ee01
commit 15549930e0
7 changed files with 49 additions and 53 deletions

View File

@@ -76,7 +76,6 @@ dependencies {
// Spring
api 'org.springframework.boot:spring-boot-starter'
api 'org.springframework.boot:spring-boot-starter-aop'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

View File

@@ -0,0 +1,42 @@
package com.bartlomiejpluta.base.core.profiling.time;
import com.bartlomiejpluta.base.core.gc.Cleanable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@Slf4j
@Component
public class DefaultTimeProfilerService implements TimeProfilerService, Cleanable {
private static final DecimalFormat DF = new DecimalFormat("0.00");
private final Map<String, Double> averages = new HashMap<>();
@Override
public void measure(String key, Runnable task) {
var start = System.nanoTime();
task.run();
var time = System.nanoTime() - start;
if (!averages.containsKey(key)) {
averages.put(key, time * 1.0);
} else {
averages.put(key, (averages.get(key) + time) / 2.0);
}
}
@Override
public void cleanUp() {
averages.entrySet().stream()
.sorted(Entry.<String, Double>comparingByValue().reversed())
.forEachOrdered(entry -> log.info("[{}]: [{}ms] [{}us] [{}ns]",
entry.getKey(),
DF.format(entry.getValue() / 1_000_000),
DF.format(entry.getValue() / 1_000),
DF.format(entry.getValue())
));
}
}

View File

@@ -0,0 +1,5 @@
package com.bartlomiejpluta.base.core.profiling.time;
public interface TimeProfilerService {
void measure(String key, Runnable task);
}

View File

@@ -1,11 +0,0 @@
package com.bartlomiejpluta.base.core.profiling.time.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MeasureExecutionTime {
}

View File

@@ -1,38 +0,0 @@
package com.bartlomiejpluta.base.core.profiling.time.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
@ConditionalOnExpression("${app.profiling.aspects:false}")
public class ExecutionTimeAspect {
@Around("@annotation(com.bartlomiejpluta.base.core.stat.metrics.annotation.MeasureExecutionTime)")
public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = 0;
long end = 0;
long elapsed;
Object result;
try {
start = System.nanoTime();
result = joinPoint.proceed();
} finally {
end = System.nanoTime();
}
elapsed = end - start;
log.debug("[{}.{}] = [{}s] [{}ms] [{}ns]",
joinPoint.getTarget().getClass().getSimpleName(),
joinPoint.getSignature().getName(),
elapsed / 1000000.0, elapsed / 1000.0, elapsed
);
return result;
}
}