Skip to content

Add StringReader input benchmark #9

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

Merged
merged 5 commits into from
Aug 20, 2023

Conversation

schlosna
Copy link
Contributor

@schlosna schlosna commented Aug 10, 2023

Builds on #6 to benchmark a CharBufferReader for FasterXML/jackson-core#1079 and StringReader for FasterXML/jackson-core#1081

@carterkozak curious for your thoughts on this. We may want to benchmark some larger inputs as well.

Initial benchmarks show StringReader and CharBufferReader providing performance equivalent to ByteArrayInputStream source in worst case, and anywhere from ~2x to ~10x speedup in best case.

# JMH version: 1.27
# VM version: JDK 20.0.2, OpenJDK 64-Bit Server VM, 20.0.2+9-FR
# 2021 Apple M1 Pro (aarch64)
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt     Score     Error  Units
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP   INPUT_STREAM  avgt    4     0.101 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP         READER  avgt    4     0.511 ±   0.068  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP    CHAR_READER  avgt    4     0.117 ±   0.003  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP  STRING_READER  avgt    4     0.106 ±   0.012  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    10.221 ±   0.090  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP         READER  avgt    4     1.936 ±   0.659  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.484 ±   0.069  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP  STRING_READER  avgt    4     1.521 ±   0.044  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    10.864 ±   2.397  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     2.334 ±   0.088  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.876 ±   0.650  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     1.832 ±   0.555  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  4104.460 ± 148.303  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   455.288 ± 130.021  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   463.358 ±   1.691  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   446.932 ±   2.978  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP   INPUT_STREAM  avgt    4     0.104 ±   0.028  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP         READER  avgt    4     0.644 ±   1.622  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP    CHAR_READER  avgt    4     0.117 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP  STRING_READER  avgt    4     0.109 ±   0.030  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     9.049 ±   0.129  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP         READER  avgt    4     1.243 ±   0.077  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.918 ±   0.016  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP  STRING_READER  avgt    4     0.910 ±   0.006  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     9.126 ±   0.134  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     1.696 ±   0.015  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.245 ±   0.027  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     1.240 ±   0.026  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   880.942 ±   8.099  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   446.997 ±   9.535  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   460.697 ±   3.942  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   449.571 ±  12.797  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4     0.566 ±   0.296  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4     0.491 ±   0.164  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP    CHAR_READER  avgt    4     0.128 ±   0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4     0.106 ±   0.006  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     0.545 ±   0.035  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4     0.529 ±   0.023  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.157 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4     0.147 ±   0.002  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     0.823 ±   0.161  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     0.719 ±   0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.398 ±   0.016  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     0.390 ±   0.105  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   398.360 ±   6.565  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   406.040 ±  75.763  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   421.452 ± 122.910  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   399.335 ±   8.686  us/op

Subset run on JDK 11.0.20 for comparison

# JMH version: 1.27
# VM version: JDK 11.0.20, OpenJDK 64-Bit Server VM, 11.0.20+8-LTS
# 2021 Apple M1 Pro (aarch64)
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt    Score    Error  Units
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4    0.510 ±  0.027  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4    0.465 ±  0.019  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4    0.116 ±  0.003  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    0.555 ±  0.017  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4    0.513 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4    0.152 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    0.786 ±  0.017  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4    0.691 ±  0.035  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4    0.394 ±  0.037  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  462.521 ± 15.392  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4  457.281 ±  8.919  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4  440.642 ± 16.539  us/op

@schlosna
Copy link
Contributor Author

schlosna commented Aug 10, 2023

Updated benchmarks with StringReader to test FasterXML/jackson-core#1081 via 8821d54 and 49100a7

# JMH version: 1.27
# VM version: JDK 20.0.2, OpenJDK 64-Bit Server VM, 20.0.2+9-FR
# 2021 Apple M1 Pro (aarch64)
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt     Score     Error  Units
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP   INPUT_STREAM  avgt    4     0.101 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP         READER  avgt    4     0.511 ±   0.068  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP    CHAR_READER  avgt    4     0.117 ±   0.003  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP  STRING_READER  avgt    4     0.106 ±   0.012  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    10.221 ±   0.090  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP         READER  avgt    4     1.936 ±   0.659  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.484 ±   0.069  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP  STRING_READER  avgt    4     1.521 ±   0.044  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    10.864 ±   2.397  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     2.334 ±   0.088  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.876 ±   0.650  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     1.832 ±   0.555  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  4104.460 ± 148.303  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   455.288 ± 130.021  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   463.358 ±   1.691  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   446.932 ±   2.978  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP   INPUT_STREAM  avgt    4     0.104 ±   0.028  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP         READER  avgt    4     0.644 ±   1.622  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP    CHAR_READER  avgt    4     0.117 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP  STRING_READER  avgt    4     0.109 ±   0.030  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     9.049 ±   0.129  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP         READER  avgt    4     1.243 ±   0.077  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.918 ±   0.016  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP  STRING_READER  avgt    4     0.910 ±   0.006  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     9.126 ±   0.134  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     1.696 ±   0.015  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     1.245 ±   0.027  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     1.240 ±   0.026  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   880.942 ±   8.099  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   446.997 ±   9.535  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   460.697 ±   3.942  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   449.571 ±  12.797  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4     0.566 ±   0.296  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4     0.491 ±   0.164  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP    CHAR_READER  avgt    4     0.128 ±   0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4     0.106 ±   0.006  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     0.545 ±   0.035  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4     0.529 ±   0.023  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.157 ±   0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4     0.147 ±   0.002  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     0.823 ±   0.161  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     0.719 ±   0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     0.398 ±   0.016  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     0.390 ±   0.105  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   398.360 ±   6.565  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   406.040 ±  75.763  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   421.452 ± 122.910  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   399.335 ±   8.686  us/op

Subset run on JDK 11.0.20 for comparison

# JMH version: 1.27
# VM version: JDK 11.0.20, OpenJDK 64-Bit Server VM, 11.0.20+8-LTS
# 2021 Apple M1 Pro (aarch64)
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt    Score    Error  Units
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4    0.510 ±  0.027  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4    0.465 ±  0.019  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4    0.116 ±  0.003  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    0.555 ±  0.017  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4    0.513 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4    0.152 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4    0.786 ±  0.017  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4    0.691 ±  0.035  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4    0.394 ±  0.037  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  462.521 ± 15.392  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4  457.281 ±  8.919  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4  440.642 ± 16.539  us/op

@schlosna
Copy link
Contributor Author

# 16 core Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz
# JMH version: 1.27
# VM version: JDK 11.0.20, OpenJDK 64-Bit Server VM, 11.0.20+8-LTS
# VM invoker: /opt/amazon-corretto-11.0.20.8.1-linux-x64/bin/java
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt      Score      Error  Units
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP   INPUT_STREAM  avgt    4      0.488 ?    0.129  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP         READER  avgt    4      2.015 ?    0.063  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP    CHAR_READER  avgt    4      0.554 ?    0.118  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP  STRING_READER  avgt    4      0.526 ?    0.133  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     46.998 ?    9.185  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP         READER  avgt    4     15.226 ?   15.231  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP    CHAR_READER  avgt    4     14.768 ?   14.649  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP  STRING_READER  avgt    4     14.561 ?   16.420  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     47.744 ?    6.230  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4     16.382 ?   12.846  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4     15.263 ?   14.656  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4     15.167 ?   14.034  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  12138.117 ? 3427.872  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   2498.825 ?  625.629  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   2638.192 ?  889.822  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   2326.147 ?  143.109  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP   INPUT_STREAM  avgt    4      0.466 ?    0.252  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP         READER  avgt    4      2.020 ?    0.094  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP    CHAR_READER  avgt    4      0.564 ?    0.106  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP  STRING_READER  avgt    4      0.523 ?    0.086  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     38.293 ?    1.328  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP         READER  avgt    4      4.884 ?    1.192  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP    CHAR_READER  avgt    4      2.416 ?    0.451  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP  STRING_READER  avgt    4      2.389 ?    0.270  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     40.087 ?    5.343  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4      6.788 ?    0.647  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4      4.337 ?    0.521  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4      4.246 ?    1.764  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   3938.335 ? 1242.189  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   2610.678 ?  471.952  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   2629.772 ?  794.216  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   2173.665 ?  855.329  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4      2.115 ?    0.214  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4      2.004 ?    0.177  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP    CHAR_READER  avgt    4      0.561 ?    0.155  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4      0.536 ?    0.184  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4      2.305 ?    0.457  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4      2.175 ?    0.078  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP    CHAR_READER  avgt    4      0.730 ?    0.137  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4      0.709 ?    0.229  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4      3.261 ?    0.301  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4      3.155 ?    0.735  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4      1.686 ?    0.172  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4      1.603 ?    0.258  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   2155.003 ?  492.814  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   2223.014 ?  837.685  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   2115.198 ?  500.588  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   2097.013 ?  997.614  us/op

@schlosna
Copy link
Contributor Author

# 16 core Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz
# JMH version: 1.27
# VM version: JDK 17.0.8, OpenJDK 64-Bit Server VM, 17.0.8+7-LTS
# VM invoker: /opt/amazon-corretto-17.0.8.7.1-linux-x64/bin/java
Benchmark                                       (mode)                   (shape)         (type)  Mode  Cnt      Score      Error  Units
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP   INPUT_STREAM  avgt    4      0.444 ?    0.176  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP         READER  avgt    4      1.586 ?    0.046  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP    CHAR_READER  avgt    4      0.510 ?    0.130  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT                   KEY_MAP  STRING_READER  avgt    4      0.490 ?    0.030  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     37.836 ?    0.537  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP         READER  avgt    4      5.466 ?    0.348  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP    CHAR_READER  avgt    4      3.708 ?    0.344  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT            RANDOM_KEY_MAP  STRING_READER  avgt    4      3.510 ?    0.411  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     38.217 ?    1.965  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4      6.967 ?    1.038  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4      5.377 ?    0.769  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4      5.195 ?    0.491  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4  12466.597 ? 2382.441  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   2038.278 ?  741.991  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   1967.816 ?  527.963  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   2001.391 ?  668.228  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP   INPUT_STREAM  avgt    4      0.453 ?    0.138  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP         READER  avgt    4      1.615 ?    0.073  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP    CHAR_READER  avgt    4      0.498 ?    0.121  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN                   KEY_MAP  STRING_READER  avgt    4      0.462 ?    0.149  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     35.022 ?    1.960  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP         READER  avgt    4      4.242 ?    0.156  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP    CHAR_READER  avgt    4      2.217 ?    0.255  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN            RANDOM_KEY_MAP  STRING_READER  avgt    4      2.181 ?    0.313  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4     35.046 ?    1.609  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4      5.829 ?    0.261  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4      3.993 ?    1.055  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4      4.009 ?    0.269  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   3641.404 ? 1501.392  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   1958.228 ?  568.089  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   2141.364 ?  807.726  us/op
JsonArbitraryFieldNameBenchmark.parse        NO_INTERN   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   1919.821 ?  288.978  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP   INPUT_STREAM  avgt    4      1.684 ?    0.119  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP         READER  avgt    4      1.640 ?    0.131  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP    CHAR_READER  avgt    4      0.525 ?    0.228  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE                   KEY_MAP  STRING_READER  avgt    4      0.493 ?    0.088  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP   INPUT_STREAM  avgt    4      1.866 ?    0.191  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP         READER  avgt    4      1.786 ?    0.088  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP    CHAR_READER  avgt    4      0.672 ?    0.092  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE            RANDOM_KEY_MAP  STRING_READER  avgt    4      0.612 ?    0.216  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP   INPUT_STREAM  avgt    4      2.778 ?    0.635  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP         READER  avgt    4      2.692 ?    0.277  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP    CHAR_READER  avgt    4      1.582 ?    0.581  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE  BEAN_WITH_RANDOM_KEY_MAP  STRING_READER  avgt    4      1.472 ?    0.488  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP   INPUT_STREAM  avgt    4   1761.579 ?  521.119  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP         READER  avgt    4   1812.295 ?  693.766  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP    CHAR_READER  avgt    4   1825.428 ?  578.811  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   BEAN_WITH_LARGE_KEY_MAP  STRING_READER  avgt    4   1652.851 ?  567.808  us/op

@schlosna schlosna changed the title Add CharBufferReader benchmark Add StringReader input benchmark Aug 18, 2023
@cowtowncoder
Copy link
Member

@schlosna LMK if/when this is ready and I can merge it.

@schlosna
Copy link
Contributor Author

@schlosna LMK if/when this is ready and I can merge it.

Hey @cowtowncoder , thanks for the review.

I think this benchmark shows StringReader is a solid win over InputStreamReader for smaller byte[] inputs and we don't need the custom CharBufferReader, so I will remove CharBufferReader from this benchmark to avoid unnecessary longer benchmark runtime.

I am curious for your thoughts on FasterXML/jackson-core#1081 using StringReader for byte[] for lengths less than a threshold (currently max 8KiB to have same upper bound allocation cost as InputStreamReader's heap ByteBuffer).

@schlosna
Copy link
Contributor Author

Ahh, just saw that merged, let me fix this benchmark up shortly.

@cowtowncoder
Copy link
Member

@schlosna Yeah -- I was thinking of asking whether threshold:

  1. Has to use magic constant (as in, is it likely InputStreamReaders default buffer size might change in future)
  2. Is it the case that sizes exactly up to default buffer size benefit; I can definitely see how it helps for short inputs (where length is a fraction if 8kB), but how about input of, say, 7kB?

so it'd be interesting to know (2). But then again it's not the a huge concern; just LMK if you have ideas of even better tuning.

@schlosna
Copy link
Contributor Author

I'll run the StringReader and InputStreamReader benchmarks with a few different sizes (say 1KiB, 2KiB, 4KiB, 7KiB, 8KiB, 16KiB, 32KiB) and report back. I'll also add some UTF16 in addition to the ASCII only encoded data as the latter will fit a char per byte with compact strings.

My sense is that the results will depend heavily on CPU cache size. Not directly applicable to this case, but OpenJDK 21 is bumping up the internal byte[] buffer size from 8KiB to 16KiB for InputStream.transferTo(OutputStream) via https://bugs.openjdk.org/browse/JDK-8299336 , but I haven't seen any discussions around the StreamEncoder's ByteBuffer size changing.

@cowtowncoder
Copy link
Member

@schlosna Sounds good: your help is much appreciated!

@schlosna
Copy link
Contributor Author

I ran a slightly modified version schlosna@ce7fcec to explicitly test different size inputs and ran locally on a MacBook Pro.

For the DEFAULT mode where interning and field name canonicalization are enabled:

  • StringReader outperforms InputStreamReader on sizes 128 to 32KiB
  • StringReader performs similar to InputStream for sizes up to 512 bytes

For the mode where field name canonicalization feature is disabled:

  • StringReader outperforms InputStreamReader on sizes 128 to 32KiB, significantly for smaller inputs and ~10% speedup for inputs in the 8KiB - 32KiB range.

The configuration @carterkozak and I have been investigating is with both interning and field name canonicalization disabled, and StringReader looks like a win over InputStreamReader for both default configuration as well as when field name canonicalization is disabled.

Based on this, I'm inclined to leave the current threshold at 8KiB for now unless other folks have objections.

# JMH version: 1.27
# VM version: JDK 11.0.20, OpenJDK 64-Bit Server VM, 11.0.20+8-LTS
# 2021 Apple M1 Pro (aarch64)
Benchmark                                                 (mode)  (size)               (type)  Mode  Cnt   Score    Error  Units
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     128         INPUT_STREAM  avgt    4   0.131 ±  0.011  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     128  INPUT_STREAM_READER  avgt    4   0.499 ±  0.122  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     128        STRING_READER  avgt    4   0.156 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     512         INPUT_STREAM  avgt    4   0.300 ±  0.024  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     512  INPUT_STREAM_READER  avgt    4   0.890 ±  0.006  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT     512        STRING_READER  avgt    4   0.395 ±  0.002  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    1024         INPUT_STREAM  avgt    4   0.504 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    1024  INPUT_STREAM_READER  avgt    4   1.336 ±  0.023  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    1024        STRING_READER  avgt    4   0.715 ±  0.004  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    2048         INPUT_STREAM  avgt    4   0.928 ±  0.003  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    2048  INPUT_STREAM_READER  avgt    4   1.951 ±  0.016  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    2048        STRING_READER  avgt    4   1.357 ±  0.006  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    4096         INPUT_STREAM  avgt    4   1.963 ±  0.008  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    4096  INPUT_STREAM_READER  avgt    4   4.295 ±  0.026  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    4096        STRING_READER  avgt    4   3.447 ±  1.158  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    7168         INPUT_STREAM  avgt    4   3.372 ±  0.060  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    7168  INPUT_STREAM_READER  avgt    4  12.235 ±  0.108  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    7168        STRING_READER  avgt    4  10.548 ±  0.115  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    8192         INPUT_STREAM  avgt    4   4.594 ±  0.021  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    8192  INPUT_STREAM_READER  avgt    4  14.645 ±  0.114  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT    8192        STRING_READER  avgt    4  12.846 ±  0.053  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   16384         INPUT_STREAM  avgt    4   9.108 ±  0.136  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   16384  INPUT_STREAM_READER  avgt    4  37.254 ± 10.114  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   16384        STRING_READER  avgt    4  33.805 ± 14.141  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   32768         INPUT_STREAM  avgt    4  18.545 ±  0.478  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   32768  INPUT_STREAM_READER  avgt    4  78.486 ±  2.047  us/op
JsonArbitraryFieldNameBenchmark.parse                    DEFAULT   32768        STRING_READER  avgt    4  72.363 ±  0.567  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     128         INPUT_STREAM  avgt    4   0.129 ±  0.002  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     128  INPUT_STREAM_READER  avgt    4   0.492 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     128        STRING_READER  avgt    4   0.158 ±  0.007  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     512         INPUT_STREAM  avgt    4   0.295 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     512  INPUT_STREAM_READER  avgt    4   0.894 ±  0.003  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN     512        STRING_READER  avgt    4   0.391 ±  0.004  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    1024         INPUT_STREAM  avgt    4   0.508 ±  0.005  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    1024  INPUT_STREAM_READER  avgt    4   1.334 ±  0.013  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    1024        STRING_READER  avgt    4   0.712 ±  0.031  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    2048         INPUT_STREAM  avgt    4   0.936 ±  0.005  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    2048  INPUT_STREAM_READER  avgt    4   2.080 ±  1.276  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    2048        STRING_READER  avgt    4   1.377 ±  0.027  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    4096         INPUT_STREAM  avgt    4   1.899 ±  0.041  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    4096  INPUT_STREAM_READER  avgt    4   4.295 ±  0.021  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    4096        STRING_READER  avgt    4   3.236 ±  0.009  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    7168         INPUT_STREAM  avgt    4   3.395 ±  0.031  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    7168  INPUT_STREAM_READER  avgt    4  12.106 ±  0.052  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    7168        STRING_READER  avgt    4   8.190 ±  0.117  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    8192         INPUT_STREAM  avgt    4   4.575 ±  0.025  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    8192  INPUT_STREAM_READER  avgt    4  14.595 ±  0.016  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN    8192        STRING_READER  avgt    4  12.784 ±  0.047  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   16384         INPUT_STREAM  avgt    4   9.113 ±  0.054  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   16384  INPUT_STREAM_READER  avgt    4  36.173 ±  0.208  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   16384        STRING_READER  avgt    4  32.565 ±  0.072  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   32768         INPUT_STREAM  avgt    4  18.553 ±  0.169  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   32768  INPUT_STREAM_READER  avgt    4  78.265 ±  0.336  us/op
JsonArbitraryFieldNameBenchmark.parse                  NO_INTERN   32768        STRING_READER  avgt    4  72.200 ±  0.228  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     128         INPUT_STREAM  avgt    4   0.591 ±  0.006  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     128  INPUT_STREAM_READER  avgt    4   0.482 ±  0.007  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     128        STRING_READER  avgt    4   0.152 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     512         INPUT_STREAM  avgt    4   0.925 ±  0.004  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     512  INPUT_STREAM_READER  avgt    4   0.893 ±  0.015  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE     512        STRING_READER  avgt    4   0.399 ±  0.002  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    1024         INPUT_STREAM  avgt    4   1.414 ±  0.032  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    1024  INPUT_STREAM_READER  avgt    4   1.401 ±  0.399  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    1024        STRING_READER  avgt    4   0.706 ±  0.003  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    2048         INPUT_STREAM  avgt    4   2.026 ±  0.350  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    2048  INPUT_STREAM_READER  avgt    4   1.964 ±  0.005  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    2048        STRING_READER  avgt    4   1.363 ±  0.002  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    4096         INPUT_STREAM  avgt    4   4.504 ±  1.668  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    4096  INPUT_STREAM_READER  avgt    4   4.279 ±  0.052  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    4096        STRING_READER  avgt    4   3.261 ±  0.019  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    7168         INPUT_STREAM  avgt    4  12.233 ±  0.275  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    7168  INPUT_STREAM_READER  avgt    4  10.104 ±  0.047  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    7168        STRING_READER  avgt    4  10.431 ±  0.075  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    8192         INPUT_STREAM  avgt    4  12.240 ±  0.158  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    8192  INPUT_STREAM_READER  avgt    4  12.408 ±  3.215  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE    8192        STRING_READER  avgt    4  12.807 ±  0.386  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   16384         INPUT_STREAM  avgt    4  36.430 ±  0.327  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   16384  INPUT_STREAM_READER  avgt    4  36.152 ±  0.278  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   16384        STRING_READER  avgt    4  32.594 ±  0.196  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   32768         INPUT_STREAM  avgt    4  78.403 ±  0.504  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   32768  INPUT_STREAM_READER  avgt    4  78.104 ±  0.164  us/op
JsonArbitraryFieldNameBenchmark.parse            NO_CANONICALIZE   32768        STRING_READER  avgt    4  72.590 ±  2.005  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     128         INPUT_STREAM  avgt    4   0.588 ±  0.014  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     128  INPUT_STREAM_READER  avgt    4   0.497 ±  0.142  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     128        STRING_READER  avgt    4   0.152 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     512         INPUT_STREAM  avgt    4   0.938 ±  0.036  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     512  INPUT_STREAM_READER  avgt    4   0.924 ±  0.267  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE     512        STRING_READER  avgt    4   0.393 ±  0.001  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    1024         INPUT_STREAM  avgt    4   1.422 ±  0.016  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    1024  INPUT_STREAM_READER  avgt    4   1.426 ±  0.772  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    1024        STRING_READER  avgt    4   0.705 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    2048         INPUT_STREAM  avgt    4   2.037 ±  0.115  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    2048  INPUT_STREAM_READER  avgt    4   1.963 ±  0.049  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    2048        STRING_READER  avgt    4   1.369 ±  0.036  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    4096         INPUT_STREAM  avgt    4   4.325 ±  0.022  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    4096  INPUT_STREAM_READER  avgt    4   4.166 ±  0.022  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    4096        STRING_READER  avgt    4   3.229 ±  0.040  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    7168         INPUT_STREAM  avgt    4  12.333 ±  0.565  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    7168  INPUT_STREAM_READER  avgt    4  12.069 ±  0.246  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    7168        STRING_READER  avgt    4   8.304 ±  0.047  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    8192         INPUT_STREAM  avgt    4  14.823 ±  0.159  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    8192  INPUT_STREAM_READER  avgt    4  14.601 ±  0.536  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE    8192        STRING_READER  avgt    4  12.840 ±  0.049  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   16384         INPUT_STREAM  avgt    4  36.332 ±  0.135  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   16384  INPUT_STREAM_READER  avgt    4  36.064 ±  1.260  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   16384        STRING_READER  avgt    4  32.493 ±  0.594  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   32768         INPUT_STREAM  avgt    4  78.594 ±  0.188  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   32768  INPUT_STREAM_READER  avgt    4  78.374 ±  0.698  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_INTERN_OR_CANONICALIZE   32768        STRING_READER  avgt    4  72.201 ±  0.279  us/op

@schlosna schlosna marked this pull request as ready for review August 19, 2023 16:13
@schlosna
Copy link
Contributor Author

Quick subset of benchmarks on OpenJDK 64-Bit Server VM, 17.0.8+7-LTS

# JMH version: 1.27
# VM version: JDK 17.0.8, OpenJDK 64-Bit Server VM, 17.0.8+7-LTS
# 2021 Apple M1 Pro (aarch64)
Benchmark                                       (mode)  (size)               (type)  Mode  Cnt   Score    Error  Units
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     128         INPUT_STREAM  avgt    3   0.127 ±  0.021  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     128  INPUT_STREAM_READER  avgt    3   0.474 ±  0.039  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     128        STRING_READER  avgt    3   0.144 ±  0.008  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     512         INPUT_STREAM  avgt    3   0.297 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     512  INPUT_STREAM_READER  avgt    3   0.790 ±  0.056  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT     512        STRING_READER  avgt    3   0.400 ±  0.027  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    1024         INPUT_STREAM  avgt    3   0.518 ±  0.036  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    1024  INPUT_STREAM_READER  avgt    3   1.129 ±  0.044  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    1024        STRING_READER  avgt    3   0.703 ±  0.066  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    2048         INPUT_STREAM  avgt    3   0.957 ±  0.066  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    2048  INPUT_STREAM_READER  avgt    3   1.609 ±  0.043  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    2048        STRING_READER  avgt    3   1.361 ±  0.062  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    4096         INPUT_STREAM  avgt    3   1.874 ±  0.078  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    4096  INPUT_STREAM_READER  avgt    3   3.040 ±  0.252  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    4096        STRING_READER  avgt    3   3.063 ±  0.305  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    7168         INPUT_STREAM  avgt    3   3.450 ±  0.203  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    7168  INPUT_STREAM_READER  avgt    3  10.561 ±  0.660  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    7168        STRING_READER  avgt    3  10.326 ±  0.173  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    8192         INPUT_STREAM  avgt    3   4.651 ±  0.140  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    8192  INPUT_STREAM_READER  avgt    3  13.058 ±  0.325  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT    8192        STRING_READER  avgt    3  12.715 ±  0.159  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   16384         INPUT_STREAM  avgt    3  10.183 ±  0.173  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   16384  INPUT_STREAM_READER  avgt    3  33.158 ±  0.867  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   16384        STRING_READER  avgt    3  32.775 ±  1.212  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   32768         INPUT_STREAM  avgt    3  18.756 ±  0.413  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   32768  INPUT_STREAM_READER  avgt    3  71.910 ± 10.326  us/op
JsonArbitraryFieldNameBenchmark.parse          DEFAULT   32768        STRING_READER  avgt    3  73.452 ± 16.835  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     128         INPUT_STREAM  avgt    3   0.571 ±  0.065  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     128  INPUT_STREAM_READER  avgt    3   0.475 ±  0.006  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     128        STRING_READER  avgt    3   0.144 ±  0.002  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     512         INPUT_STREAM  avgt    3   0.816 ±  0.030  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     512  INPUT_STREAM_READER  avgt    3   0.786 ±  0.035  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE     512        STRING_READER  avgt    3   0.388 ±  0.096  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    1024         INPUT_STREAM  avgt    3   1.181 ±  0.023  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    1024  INPUT_STREAM_READER  avgt    3   1.105 ±  0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    1024        STRING_READER  avgt    3   0.698 ±  0.004  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    2048         INPUT_STREAM  avgt    3   1.535 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    2048  INPUT_STREAM_READER  avgt    3   1.537 ±  0.088  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    2048        STRING_READER  avgt    3   1.456 ±  3.178  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    4096         INPUT_STREAM  avgt    3   3.074 ±  0.160  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    4096  INPUT_STREAM_READER  avgt    3   3.047 ±  0.010  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    4096        STRING_READER  avgt    3   3.113 ±  0.040  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    7168         INPUT_STREAM  avgt    3  10.696 ±  0.510  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    7168  INPUT_STREAM_READER  avgt    3  10.650 ±  2.855  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    7168        STRING_READER  avgt    3  11.025 ± 23.020  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    8192         INPUT_STREAM  avgt    3  13.127 ±  0.576  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    8192  INPUT_STREAM_READER  avgt    3  13.048 ±  0.202  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE    8192        STRING_READER  avgt    3  12.708 ±  0.513  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   16384         INPUT_STREAM  avgt    3  33.210 ±  0.632  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   16384  INPUT_STREAM_READER  avgt    3  32.922 ±  0.386  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   16384        STRING_READER  avgt    3  32.588 ±  0.890  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   32768         INPUT_STREAM  avgt    3  71.790 ±  0.834  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   32768  INPUT_STREAM_READER  avgt    3  72.577 ± 11.414  us/op
JsonArbitraryFieldNameBenchmark.parse  NO_CANONICALIZE   32768        STRING_READER  avgt    3  72.497 ± 13.592  us/op

@cowtowncoder
Copy link
Member

Thank you @schlosna for verifying that 8kB limit seems sensible.

@cowtowncoder cowtowncoder merged commit b002c84 into FasterXML:2.15 Aug 20, 2023
@schlosna schlosna deleted the ds/ByteSourceBenchmark branch September 14, 2023 12:07
schlosna added a commit to palantir/atlasdb that referenced this pull request Sep 22, 2023
Optimize to avoid allocation of heap ByteBuffer via InputStreamReader.
Remove after upgrade to Jackson 2.16.

see: FasterXML/jackson-core#1081 and
FasterXML/jackson-benchmarks#9
bulldozer-bot bot pushed a commit to palantir/atlasdb that referenced this pull request Sep 25, 2023
Optimize to avoid allocation of heap ByteBuffer via InputStreamReader. Remove after upgrade to Jackson 2.16.

see: FasterXML/jackson-core#1081 and FasterXML/jackson-benchmarks#9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants