deea51e609
Motivation: Huffman coding saves only a little space, but has a huge CPU cost Modification: Disable huff coding for headers smaller than 512 bytes. Also, add a configurable limit to the encoder. Result: Faster HPACK BEFORE: ``` Benchmark (duplicates) (limitToAscii) (sensitive) (size) Mode Cnt Score Error Units HpackEncoderBenchmark.encode true true true SMALL avgt 10 2572.595 ± 16.184 ns/op HpackEncoderBenchmark.encode true true true MEDIUM avgt 10 19580.815 ± 397.780 ns/op HpackEncoderBenchmark.encode true true true LARGE avgt 10 379456.381 ± 2059.919 ns/op HpackEncoderBenchmark.encode true true false SMALL avgt 10 730.579 ± 8.116 ns/op HpackEncoderBenchmark.encode true true false MEDIUM avgt 10 2087.590 ± 84.644 ns/op HpackEncoderBenchmark.encode true true false LARGE avgt 10 11725.228 ± 89.298 ns/op HpackEncoderBenchmark.encode true false true SMALL avgt 10 555.971 ± 5.120 ns/op HpackEncoderBenchmark.encode true false true MEDIUM avgt 10 2831.874 ± 41.801 ns/op HpackEncoderBenchmark.encode true false true LARGE avgt 10 36054.025 ± 179.504 ns/op HpackEncoderBenchmark.encode true false false SMALL avgt 10 340.337 ± 3.313 ns/op HpackEncoderBenchmark.encode true false false MEDIUM avgt 10 1006.817 ± 8.942 ns/op HpackEncoderBenchmark.encode true false false LARGE avgt 10 8784.168 ± 164.014 ns/op HpackEncoderBenchmark.encode false true true SMALL avgt 10 2561.934 ± 27.056 ns/op HpackEncoderBenchmark.encode false true true MEDIUM avgt 10 22061.105 ± 154.533 ns/op HpackEncoderBenchmark.encode false true true LARGE avgt 10 435744.897 ± 8853.388 ns/op HpackEncoderBenchmark.encode false true false SMALL avgt 10 2737.683 ± 47.142 ns/op HpackEncoderBenchmark.encode false true false MEDIUM avgt 10 22385.146 ± 98.430 ns/op HpackEncoderBenchmark.encode false true false LARGE avgt 10 408159.698 ± 12044.931 ns/op HpackEncoderBenchmark.encode false false true SMALL avgt 10 544.213 ± 3.279 ns/op HpackEncoderBenchmark.encode false false true MEDIUM avgt 10 2908.978 ± 31.026 ns/op HpackEncoderBenchmark.encode false false true LARGE avgt 10 36471.262 ± 1044.010 ns/op HpackEncoderBenchmark.encode false false false SMALL avgt 10 609.305 ± 4.371 ns/op HpackEncoderBenchmark.encode false false false MEDIUM avgt 10 3223.946 ± 23.505 ns/op HpackEncoderBenchmark.encode false false false LARGE avgt 10 39975.152 ± 655.196 ns/op ``` AFTER: ``` NEW AFTER Benchmark (duplicates) (limitToAscii) (sensitive) (size) Mode Cnt Score Error Units HpackEncoderBenchmark.encode true true true SMALL avgt 5 379.473 ± 133.815 ns/op HpackEncoderBenchmark.encode true true true MEDIUM avgt 5 1118.772 ± 89.258 ns/op HpackEncoderBenchmark.encode true true true LARGE avgt 5 5366.828 ± 89.746 ns/op HpackEncoderBenchmark.encode true true false SMALL avgt 5 284.401 ± 2.088 ns/op HpackEncoderBenchmark.encode true true false MEDIUM avgt 5 922.805 ± 10.796 ns/op HpackEncoderBenchmark.encode true true false LARGE avgt 5 8727.831 ± 462.138 ns/op HpackEncoderBenchmark.encode true false true SMALL avgt 5 337.093 ± 22.585 ns/op HpackEncoderBenchmark.encode true false true MEDIUM avgt 5 693.689 ± 16.351 ns/op HpackEncoderBenchmark.encode true false true LARGE avgt 5 5616.786 ± 98.647 ns/op HpackEncoderBenchmark.encode true false false SMALL avgt 5 286.708 ± 13.765 ns/op HpackEncoderBenchmark.encode true false false MEDIUM avgt 5 906.279 ± 32.338 ns/op HpackEncoderBenchmark.encode true false false LARGE avgt 5 8304.736 ± 128.584 ns/op HpackEncoderBenchmark.encode false true true SMALL avgt 5 351.381 ± 15.547 ns/op HpackEncoderBenchmark.encode false true true MEDIUM avgt 5 1188.166 ± 7.023 ns/op HpackEncoderBenchmark.encode false true true LARGE avgt 5 6876.009 ± 48.117 ns/op HpackEncoderBenchmark.encode false true false SMALL avgt 5 434.759 ± 8.619 ns/op HpackEncoderBenchmark.encode false true false MEDIUM avgt 5 954.588 ± 58.514 ns/op HpackEncoderBenchmark.encode false true false LARGE avgt 5 8534.017 ± 552.597 ns/op HpackEncoderBenchmark.encode false false true SMALL avgt 5 223.713 ± 4.823 ns/op HpackEncoderBenchmark.encode false false true MEDIUM avgt 5 1181.538 ± 11.851 ns/op HpackEncoderBenchmark.encode false false true LARGE avgt 5 6670.830 ± 267.927 ns/op HpackEncoderBenchmark.encode false false false SMALL avgt 5 424.609 ± 27.477 ns/op HpackEncoderBenchmark.encode false false false MEDIUM avgt 5 1003.578 ± 53.991 ns/op HpackEncoderBenchmark.encode false false false LARGE avgt 5 8428.932 ± 102.838 ns/op ``` |
||
---|---|---|
.github | ||
.mvn | ||
all | ||
bom | ||
buffer | ||
codec | ||
codec-dns | ||
codec-haproxy | ||
codec-http | ||
codec-http2 | ||
codec-memcache | ||
codec-mqtt | ||
codec-redis | ||
codec-smtp | ||
codec-socks | ||
codec-stomp | ||
codec-xml | ||
common | ||
dev-tools | ||
docker | ||
example | ||
handler | ||
handler-proxy | ||
license | ||
microbench | ||
resolver | ||
resolver-dns | ||
tarball | ||
testsuite | ||
testsuite-autobahn | ||
testsuite-http2 | ||
testsuite-native-image | ||
testsuite-osgi | ||
testsuite-shading | ||
transport | ||
transport-native-epoll | ||
transport-native-kqueue | ||
transport-native-unix-common | ||
transport-native-unix-common-tests | ||
transport-rxtx | ||
transport-sctp | ||
transport-udt | ||
.fbprefs | ||
.gitattributes | ||
.gitignore | ||
CONTRIBUTING.md | ||
LICENSE.txt | ||
mvnw | ||
mvnw.cmd | ||
NOTICE.txt | ||
pom.xml | ||
README.md | ||
run-example.sh |
Netty Project
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
Links
How to build
For the detailed information about building and developing Netty, please visit the developer guide. This page only gives very basic information.
You require the following to build Netty:
- Latest stable Oracle JDK 7
- Latest stable Apache Maven
- If you are on Linux, you need additional development packages installed on your system, because you'll build the native transport.
Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+) is enough to run your Netty-based application.
Branches to look
Development of all versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>
. For example, the development of 3.9 and 4.0 resides in the branch '3.9' and the branch '4.0' respectively.
Usage with JDK 9
Netty can be used in modular JDK9 applications as a collection of automatic modules. The module names follow the reverse-DNS style, and are derived from subproject names rather than root packages due to historical reasons. They are listed below:
io.netty.all
io.netty.buffer
io.netty.codec
io.netty.codec.dns
io.netty.codec.haproxy
io.netty.codec.http
io.netty.codec.http2
io.netty.codec.memcache
io.netty.codec.mqtt
io.netty.codec.redis
io.netty.codec.smtp
io.netty.codec.socks
io.netty.codec.stomp
io.netty.codec.xml
io.netty.common
io.netty.handler
io.netty.handler.proxy
io.netty.resolver
io.netty.resolver.dns
io.netty.transport
io.netty.transport.epoll
(native
omitted - reserved keyword in Java)io.netty.transport.kqueue
(native
omitted - reserved keyword in Java)io.netty.transport.unix.common
(native
omitted - reserved keyword in Java)io.netty.transport.rxtx
io.netty.transport.sctp
io.netty.transport.udt
Automatic modules do not provide any means to declare dependencies, so you need to list each used module separately
in your module-info
file.