Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More performance improvements #8993

Merged
merged 35 commits into from
Mar 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
2ea359a
add benchmark for full http stack
yawkat Mar 17, 2023
8e32737
don't include WebSocketServerCompressionHandler if websockets are not…
yawkat Mar 17, 2023
4648f17
optimize NettyHttpHeaders.contentType
yawkat Mar 17, 2023
ab5e95a
improve benchmark (no opt)
yawkat Mar 17, 2023
8287825
avoid use of TypeParameterMatcher
yawkat Mar 17, 2023
7cf3e03
make CorsFilter use new filter apis
yawkat Mar 17, 2023
9214d4f
increase warmup further
yawkat Mar 20, 2023
c4cfa95
increase attribute map size
yawkat Mar 20, 2023
a315d88
change benchmark to use a fastthreadlocalthread to better match real …
yawkat Mar 20, 2023
cadbbb4
fix test imports
yawkat Mar 20, 2023
53930a6
add DelayedExecutionFlow to replace CompletableFuture on the hot path
yawkat Mar 20, 2023
83491b7
fix build
yawkat Mar 20, 2023
01d337d
checkstyle
yawkat Mar 21, 2023
697feea
optimize header loading for CorsFilter
yawkat Mar 21, 2023
c834d7b
optimize contentLength
yawkat Mar 21, 2023
a493353
optimize MediaType#orderedOf
yawkat Mar 21, 2023
c0c16bc
Cache object codec in JsonConverterRegistrar
yawkat Mar 21, 2023
fb2795b
Merge branch '4.0.x' into stack-benchmark
yawkat Mar 21, 2023
b5769b8
avoid composite buffer and slice in JsonContentProcessor
yawkat Mar 22, 2023
28dc533
deduplicate header parse logic
yawkat Mar 22, 2023
c415973
avoid contentType calls in NettyHttpResponseFactory
yawkat Mar 23, 2023
1020d3c
fix JacksonCoreParserFactory
yawkat Mar 23, 2023
fd53e43
add a CopyOnWriteMap, use it to cache HttpContentProcessors
yawkat Mar 23, 2023
b99594a
Cache Argument.isReactive
yawkat Mar 23, 2023
752cdc9
cache NettyHttpRequest.getContentLength
yawkat Mar 23, 2023
522920f
checkstyle
yawkat Mar 23, 2023
71253e2
cache content type
yawkat Mar 23, 2023
b985cab
improve MediaType comparison
yawkat Mar 23, 2023
4b9f113
avoid stream in NettyRequestLifecycle
yawkat Mar 23, 2023
71e7371
cache request origin
yawkat Mar 23, 2023
9408580
fix test
yawkat Mar 24, 2023
e3ca55f
fix test
yawkat Mar 24, 2023
4e1696f
Merge branch '4.0.x' into stack-benchmark
yawkat Mar 24, 2023
e061041
fix test
yawkat Mar 24, 2023
25b7162
checkstyle
yawkat Mar 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package io.micronaut.core;

import io.micronaut.core.util.CopyOnWriteMap;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

public class CopyOnWriteMapBenchmark {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(CopyOnWriteMapBenchmark.class.getName() + ".*")
.warmupIterations(3)
.measurementIterations(5)
.mode(Mode.AverageTime)
.timeUnit(TimeUnit.NANOSECONDS)
.forks(1)
//.addProfiler(LinuxPerfAsmProfiler.class)
.build();

new Runner(opt).run();
}

@Benchmark
public String get(S s) {
return s.map.get("foo");
}

@Benchmark
public String computeIfAbsent(S s) {
return s.map.computeIfAbsent("fizz", s.ciaUpdate);
}

@Benchmark
public String getWithCheck(S s) {
String v = s.map.get("fizz");
if (v == null) {
return s.map.computeIfAbsent("fizz", s.ciaUpdate);
} else {
return v;
}
}

@State(Scope.Thread)
public static class S {
@Param({"CHM", "COW"})
Type type;
@Param({"1", "2", "5", "10"})
int load;
private Map<String, String> map;
private Function<String, String> ciaUpdate;

@Setup
public void setUp() {
map = switch (type) {
case CHM -> new ConcurrentHashMap<>(16, 0.75f, 1);
case COW -> new CopyOnWriteMap<>(16);
};
// doesn't really stress the collision avoidance algorithm but oh well
map.put("foo", "bar");
for (int i = 0; i < load; i++) {
map.put("f" + i, "b" + i);
}
ciaUpdate = m -> "buzz" + m;
}
}

public enum Type {
CHM,
COW,
}
}
11 changes: 11 additions & 0 deletions core/src/main/java/io/micronaut/core/type/DefaultArgument.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ public class DefaultArgument<T> implements Argument<T>, ArgumentCoercible<T> {
private final AnnotationMetadata annotationMetadata;
private final boolean isTypeVar;
private String namePrecalculated;
private Boolean reactive;

/**
* @param type The type
Expand Down Expand Up @@ -225,6 +226,16 @@ public Class<T> getType() {
return type;
}

@Override
public boolean isReactive() {
Boolean reactive = this.reactive;
if (reactive == null) {
reactive = Argument.super.isReactive();
this.reactive = reactive;
}
return reactive;
}

@Override
@NonNull
public String getName() {
Expand Down
Loading