You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by vl...@apache.org on 2023/06/02 13:50:21 UTC

[jmeter] branch master updated: test: Add OpenJDK JMH for creating microbenchmarks in JMeter code

This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git


The following commit(s) were added to refs/heads/master by this push:
     new a2690e8a6d test: Add OpenJDK JMH for creating microbenchmarks in JMeter code
a2690e8a6d is described below

commit a2690e8a6d22420869eb89643c116901cc5c5bce
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Wed May 31 09:07:32 2023 +0300

    test: Add OpenJDK JMH for creating microbenchmarks in JMeter code
    
    This enables creating benchmark for tracking performance of low-level code.
    
    The way to add a benchmark is to add src/jmh folder (side by side with src/main).
    Then benchmark jar can be generated with ./gradlew jmhJar, or the benchmark
    can be executed from IDE if there's a corresponding main method.
    
    See ResultCollectorBenchmark
---
 build-logic/checksum.xml                           |  6 ++
 .../4b/71499a87dc1ff84b.fingerprints               |  1 +
 .../12d16069219c90212a974d119ae296fd02e9f65b.asc   | 26 +++++++
 .../5b/9ae296fd02e9f65b.fingerprints               |  1 +
 .../71/c45d01093dcfc371.fingerprints               |  1 +
 .../019082bc00e0324e2aef4cf00d3b328562a119a7.asc   | 26 +++++++
 .../a7/0d3b328562a119a7.fingerprints               |  1 +
 .../ad/0da8a5ec02d11ead.fingerprints               |  1 +
 .../517b94f8d0a46317a28d8ab30da8a5ec02d11ead.asc   | 24 +++++++
 .../e3/2f3c9eeb05d1d1e3.fingerprints               |  1 +
 build-logic/jvm/build.gradle.kts                   |  1 +
 .../jvm/src/main/kotlin/build-logic.jmh.gradle.kts | 79 ++++++++++++++++++++++
 .../main/kotlin/build-logic.jvm-library.gradle.kts |  4 ++
 checksum.xml                                       | 11 +++
 .../12d16069219c90212a974d119ae296fd02e9f65b.asc   | 26 +++++++
 .../5b/9ae296fd02e9f65b.fingerprints               |  1 +
 .../71/c45d01093dcfc371.fingerprints               |  1 +
 .../019082bc00e0324e2aef4cf00d3b328562a119a7.asc   | 26 +++++++
 .../a7/0d3b328562a119a7.fingerprints               |  1 +
 .../e3/2f3c9eeb05d1d1e3.fingerprints               |  1 +
 src/bom-testing/build.gradle.kts                   |  2 +
 .../jmeter/reporters/ResultCollectorBenchmark.java | 72 ++++++++++++++++++++
 .../jmeter/samplers/SampleSaveConfiguration.java   |  4 ++
 xdocs/changes.xml                                  |  1 +
 24 files changed, 318 insertions(+)

diff --git a/build-logic/checksum.xml b/build-logic/checksum.xml
index 89e5dbea48..5448d553a1 100644
--- a/build-logic/checksum.xml
+++ b/build-logic/checksum.xml
@@ -36,9 +36,11 @@
     <trusted-key id='ea23db1360d9029481e7f2efecdfea3cb4493b94' group='jline' />
     <trusted-key id='ff6e2c001948c5f2f38b0cc385911f425ec61b51' group='junit' />
     <trusted-key id='fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd' group='net.java.dev.jna' />
+    <trusted-key id='517b94f8d0a46317a28d8ab30da8a5ec02d11ead' group='net.sf.jopt-simple' />
     <trusted-key id='a1885c07a3204611fb184ef7098a31f381819057' group='net.sourceforge.nekohtml' />
     <trusted-key id='124dac8350968ec2a8260584ee8ecbbbc188fd5d' group='org.ajoberstar.grgit' />
     <trusted-key id='8da70c00df7af1b0d2f9dc74ddbcc1270a29d081' group='org.apache.ant' />
+    <trusted-key id='12d16069219c90212a974d119ae296fd02e9f65b' group='org.apache.commons' />
     <trusted-key id='0785b3eff60b1b1bea94e0bb7c25280eae63ebe5' group='org.apache.httpcomponents' />
     <trusted-key id='08f0aab4d0c1a4bdde340765b341ddb020fcb6ab' group='org.bouncycastle' />
     <trusted-key id='19beab2d799c020f17c69126b16698a4adf4d638' group='org.checkerframework' />
@@ -60,6 +62,7 @@
     <trusted-key id='f3184bcd55f4d016e30d4c9bf42e87f9665015c9' group='org.jsoup' />
     <trusted-key id='ff6e2c001948c5f2f38b0cc385911f425ec61b51' group='org.junit.jupiter' />
     <trusted-key id='ff6e2c001948c5f2f38b0cc385911f425ec61b51' group='org.junit.platform' />
+    <trusted-key id='019082bc00e0324e2aef4cf00d3b328562a119a7' group='org.openjdk.jmh' />
     <trusted-key id='ff6e2c001948c5f2f38b0cc385911f425ec61b51' group='org.opentest4j' />
     <trusted-key id='475f3b8e59e6e63aa78067482c7b12f2a511e325' group='org.slf4j' />
     <trusted-key id='2b1042677fd8190c7b9fc0dc2161d72e7dcd4258' group='org.sonarsource.scanner.api' />
@@ -79,6 +82,9 @@
     <dependency group='io.freefair.gradle' module='lombok-plugin' version='5.3.3.3'>
       <sha512>750C97C7BE33EEF83B43A94E4342F978F5FDB0E4A523ABB408CC1E2111CE214CEC3A6177265618A8429FFB6C09A0E47070C68F2F046F3A6CCC0F5DD77D2E2ED0</sha512>
     </dependency>
+    <dependency group='me.champeau.jmh' module='jmh-gradle-plugin' version='0.7.1'>
+      <sha512>D0B6A85CA7261FCEF0B2796F8FAD16C1044822AFE5ECD896B1103D7015FF690E806EC969B01150E9CA3FF96607AB53B6468ED2D5F3260C019CAE953B2291E7A4</sha512>
+    </dependency>
     <dependency group='net.ltgt.gradle' module='gradle-errorprone-plugin' version='3.1.0'>
       <sha512>3D4753C1818615A894B33EB51E16A1D9F820D997EB1C3F2FFD0AC2345A0F587D53044C0BE1D9D6B776C1994D9AE3D7036064D4A801EF88D478D3D219F1964D1D</sha512>
     </dependency>
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/4b/71499a87dc1ff84b.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/4b/71499a87dc1ff84b.fingerprints
new file mode 100644
index 0000000000..8f7648dd90
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/4b/71499a87dc1ff84b.fingerprints
@@ -0,0 +1 @@
+517b94f8d0a46317a28d8ab30da8a5ec02d11ead
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc
new file mode 100644
index 0000000000..5a57652271
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc
@@ -0,0 +1,26 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBEzH8KcBEADyHAdW2cHj2SfvmdAG3yG0NIlfdSWXG06k7BGUatjNfaIGHVSv
+r0U3WlGlUowiLqPhZfQf3v/tvd7yDKZ1Tk3p3A3rEVEZQ26u/o66QgTNjl15YmaR
+W6/+MOieKsNTghAogNiTOp6dgrFn6Uw2iCFgRUr8Z8dPUSRwtoPtw359nyIIllEf
+lBt8ZPbmTZ3rn6y9TYviFIbO+pIVc5iGuHCyr+9NXdOpNKpUKd4h2TLtixtcNWY0
+6TRLhbd4COwZVL9ZZwAlyKhQ4TbvvKvVCS9+HPd9onQ55s9iqUTA9xeRW3D5aVOA
+0VgXrFnAq5HE2x7+j1qZQRqMNpVTDgUptpDG5lj7rIdgMaYj+vL/bgmK8thg9su4
+8TdPgza1ex5Q4Hb0tbxg/H7Ucasxys0MJ9ktG91vgR0oHP0y0Lf/3uyoCyhKilKO
+yDqkKFeKcTx9TCZfV29gDs4dumH1Eirpg5ikKjPExhaITZgtV401CDsS+DgXHqEk
+YN9R59qJ27AUV6J3dAAumzXECXBDcvyLdb7pEIBs5/QtdgE2ivCH8BwFlmcdqe0+
+uKL0jgylMDsfiADVhzagv899MqrmQh8po6Sj78G0gwdfCF9neZgX2czolSFYFSy0
+rmSwUetem6IPwaXpV5r3852P+MqEvI2s86c3ZIyGFO0ltK5KSZq62DANqwARAQAB
+uQINBEzH8KcBEAC+7OdU8Xc38u7HpPQQPAmBHw5UIACUFP3/xrsh6dDj2B0TMlsb
+mKP1MDAN3qb9lwci2NEUgLKWrByQdTMMYfOuJuGwFYZ2gU0awpvaD4mb07gQ8qxV
+pHfpHSdpLMYscViIKhTcqAY4RIB85FUN26F8lpetQ93kKxSegMdLW1kwB9UTH6ik
+86hvTCT5ggbupzWdsUh1Sd+0UJBpgLn+NBQwjv7pzPVdSx8+9XA/G77iZPNeVihe
+VTtUfoubpN3BpKoRrJVieZX8YjF2RJmzSjPBzt4mLKPec8AGPxDzc7f4/NXX445k
+BkOyDJCQxwCTHjmF1LEJbxipdPTGrWiIw467U1LrFCsuqc+ewGJBZWMkXEWWMzQF
+axbIDKy8txnTgi9nkEYW/s0QjXa7+1jWUye52aVsBpNc5t/bh4JxJ53u5qcXwQYP
+hTL0o2pXkgoXpRAbwhoZ1IpRGL+FMyAONYdEPRtv4Q4udUQx3DEeNZw3oMpXHHFd
+S7KUiLhQfESgHyR7kugpZYwbCQO+feSCWys3rMKL3s+8kQq8LqjG/xXOLiLJRDku
+7n/y9FUWZzNCgpx8pftU3bQRpDLA7yow8FXRoeQbmSM4aVydYJhaehYRoEmrlJ0R
+MwlnG0OV7kgTipJgaxaBfrxP2N8Khgf4dbhdxslkZPmpD6+scgT2U6MgqwARAQAB
+=tJcb
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints
new file mode 100644
index 0000000000..3145005c70
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints
@@ -0,0 +1 @@
+12d16069219c90212a974d119ae296fd02e9f65b
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints
new file mode 100644
index 0000000000..78a0517548
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints
@@ -0,0 +1 @@
+019082bc00e0324e2aef4cf00d3b328562a119a7
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc
new file mode 100644
index 0000000000..24e073b181
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc
@@ -0,0 +1,26 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBE4rG7gBEADo5n849j3hlKrvFzt6y65grIxTlbLDXEB7+6sw0Xwuh4NrK/Zg
+0+eF0vvCCZrl3lHE2duD2ng9ZXz8EvUSNfwKMQz+cwF0klhP92u6mykKJ3/DZ4yo
+wojLPkIr5tVo4ybeVIbQ3N4+FnqzpNfs571KZHUOa2unwdgGK7OGMTxTkP8oaRwP
+H5VenaKoknbLbp2CUchQT3pkv3Yio+NIDGgZ1VmgOTqczI2KZe1viqRY32rBVKr1
+684Bgygf0ZfzMyKd1xK5UvDGhfQU+uDZrV9f81YMqJ9dZFjbZsyIhsEtIloTp0/Y
+kDtUMlkXF1c8EExpqTEUwEBwV+ow3IKVv3YDNNpZ8g8TQa7wKcpOia7UmEdXraY6
+PdP5tzClCqV0PqOxdNh+En9tw3VNKqAjQ9EE/nSbRz5d0JgdIA6SfPeXqAK5hxuT
+fdOdleywcOa1HRVN4xoEsOljfQiS1dz2xzou0mR1NpnD4PuGRdx4wwYGmkqulbbt
+1wQJRd/psyFfnpxrqk9I4frouzxMcrPUDH+T5qAVfkX3LG5XRGFkScWbZ65SXXB6
+wg6DsFNUXl1is01Wfda0TvBXdjO19RdcVSyD/DlAlXukmQb36Av3pHatR5Y8k7xN
+c1tU4G6dSfiD/JjwnCTzfqmHBnS4c2d1JKscPGRy+Y82Ghj2lPmunn6D9QARAQAB
+uQINBE4rG7gBEADdSXw7MJF5zFEN7siT74kGxyBO40gfhW2HTIbGXyUHKGpknHOH
+V3KYS0GEtvLc8QGOHv5qLfYlCejD5cYpzoDcWIUo1KZiaqG6LulcAy8sDuX3o5z0
+LpUikutXeIxGTgxdpc3SfYPhb43ir6pPI42MhgFOOAAhHLo9yE24G5FYna5S5OZx
+eOWiwelhYUxBMTIyA+vwCUii91ZSO5ByPU9d0QJBS2Y1Xwp0SDDa5z1x+SYRx1XO
+a8aD7/tb+K1G+giuedY5J2eVKvxFB0ABqdTNT1tj9bZmXqfKEjpaziXa9WVSNNU0
+De6IYZFsDJ9yC/3mYBB4rNd3iqQnlH6bTIaSWGA1I13JZQUm0dJet9IwxP7rCgM8
+lSsPXjvdTvHZItIIYQaMihUp3360G16ESiVRXIXwRyUztm9MMNhVzTkFXkJ9G5WX
++3Og8inNjzJViJGfqgZ4KNlXql9/BtqlsPcmTeMoZf2LCz86uTfUrhf18AVJJq2E
+B/R9M+TWQ7R9SEpQ49RoZUfVXb/HKVnWw9OjJyGFhc58MBGyT1VNGpvwDEzceJfG
+ri71lnyCAddNc10wNyfeF069wVoGTZyWklWgC7UB6dUn+9TYN2/ZpHtDzzdAoEOp
+pFdqib0+xfeY0mt9k0/jPvK2wqXMY3Vi2nvVDQNUEEJxMLSFBiqAA88EDwARAQAB
+=ZVwp
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints
new file mode 100644
index 0000000000..78a0517548
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints
@@ -0,0 +1 @@
+019082bc00e0324e2aef4cf00d3b328562a119a7
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/0da8a5ec02d11ead.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/0da8a5ec02d11ead.fingerprints
new file mode 100644
index 0000000000..8f7648dd90
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/0da8a5ec02d11ead.fingerprints
@@ -0,0 +1 @@
+517b94f8d0a46317a28d8ab30da8a5ec02d11ead
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/517b94f8d0a46317a28d8ab30da8a5ec02d11ead.asc b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/517b94f8d0a46317a28d8ab30da8a5ec02d11ead.asc
new file mode 100644
index 0000000000..013825e272
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/ad/517b94f8d0a46317a28d8ab30da8a5ec02d11ead.asc
@@ -0,0 +1,24 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ
+2sXLXYT1bJKmSaMw+yKjp8J/NYk69EbmSK1C2nypLQtWhUmXXd3XVYw6hrG/dGvi
+gjkS5eq8L04f5CSuXO7r1eLTOch9iDl/ESaI5Nhq9A3mRQIhQalum+FjzwCgx0PK
+hoC4MVPVGXzOQPc5sG4jzAUD/0OX9c/yKQqjHUs38HTCgrjseM40iPhp8NfbWenP
+IwUMSWXE3lz0MMeKrGcEOcZOGWsjyepkLHXwj8DDOeGxhfh9bhFRJssdfzOCKBpf
+6S70A3fanzqOAvddxCqF/zOwDaieDmWvVntVpmZO9d+pgR/sZN0JgSIm7qGDdNqG
+Aq6eBACyywfwuVoY6lfNz70ZZqYjYuUkbKnKqpG0XmI+m5LYrUW7QuKJqaNdg+ZL
+vVgX/TdkWVSIoSRS5+eYm3fRD++cg3ZgoR6ZY4WEa7SRSp2zoidtQijWOzp8WeHs
+30rIaXBrb5wHR4GQ4FYsBGRuWkmIaferusllUmHCHFJI4ldvgbkCDQRNyzHzEAgA
+1rD70DvCcy91ShQKP2snZ4cLJnFwKArulDUcxoBZ0AG0qMbaE8jiiJTHIwgVrqsK
+aS1JENv6tVdUS8xHswu30zvd0obaj+4IGXlMVdc6052Y4SLAGNbGVw99Ah1OkQ7o
+v92gmYAYfqppOtRt1tylz7Jf+F6er0umdVBZm8fJ+QjzTw36AwERj2bjVbc6ogM7
+OsTyru5oZGOJ+oJU+M9/mh/Gq3AyrcfU8c6bL2pacXwylME4lxy4fBB7BsMogPXX
+iplZ2XRH7RmlZiAfLHv3StxVB1RrLXVcjdnqIO2guVYrK6mxH9WMG4LnOGvcnYTf
+GtWexEmNA5l8IOSgsK+InwADBQgA037clDFi3XWaZBVXst7IfkU6bKq9vhmphS4f
+uBx4wp7MBA62k0kGDmZWcbinZWnybypili9ihYSHlp3EYzCNTbUMWlbhc/ffYHuv
+rZsIT2DxMPb2iCnjPu5HMGegTM8iTTotW4xYmJUsEDIvgQUz0/UNsPHTX5XU09So
+cL3YOP5MxcEbgO0Fpjny3X76rc+ETAd9TmDJi7HOm24grKdOQXHQJr65j7nTc9M3
+zWnTxOP3fL9jcVnGTnLGRVoR7kedDpa5FsoFqtY8YMaFvNPVvI4+m+jozjNwTg2d
+GG6nU2dEC0qgDEeKMSJwF1wgO3Fe6mXHvxratgNrqfdY/rtEGQ==
+=PkzR
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints
new file mode 100644
index 0000000000..3145005c70
--- /dev/null
+++ b/build-logic/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints
@@ -0,0 +1 @@
+12d16069219c90212a974d119ae296fd02e9f65b
diff --git a/build-logic/jvm/build.gradle.kts b/build-logic/jvm/build.gradle.kts
index 7044d76d98..493223adb1 100644
--- a/build-logic/jvm/build.gradle.kts
+++ b/build-logic/jvm/build.gradle.kts
@@ -22,6 +22,7 @@ plugins {
 dependencies {
     api(projects.buildParameters)
     api(projects.verification)
+    api("me.champeau.jmh:me.champeau.jmh.gradle.plugin:0.7.1")
     api("com.github.vlsi.crlf:com.github.vlsi.crlf.gradle.plugin:1.88")
     api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.88")
     api("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.21")
diff --git a/build-logic/jvm/src/main/kotlin/build-logic.jmh.gradle.kts b/build-logic/jvm/src/main/kotlin/build-logic.jmh.gradle.kts
new file mode 100644
index 0000000000..4dfce3ff86
--- /dev/null
+++ b/build-logic/jvm/src/main/kotlin/build-logic.jmh.gradle.kts
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import net.ltgt.gradle.errorprone.ErrorProneOptions
+import net.ltgt.gradle.errorprone.errorprone
+
+plugins {
+    id("build-logic.jvm-library")
+    id("me.champeau.jmh")
+}
+
+if (file("src/jmh/kotlin").isDirectory) {
+    apply(plugin = "build-logic.kotlin")
+}
+
+dependencies {
+    findProject(":src:bom-testing")?.let{
+        jmhImplementation(platform(it))
+    }
+    jmhImplementation("org.openjdk.jmh:jmh-core")
+    jmhImplementation("org.openjdk.jmh:jmh-generator-annprocess")
+}
+
+tasks.jmh {
+    outputs.upToDateWhen {
+        false
+    }
+}
+
+tasks.jmhCompileGeneratedClasses {
+    options.annotationProcessorPath = configurations.jmhAnnotationProcessor.get()
+}
+
+plugins.withId("net.ltgt.errorprone") {
+    tasks.jmhCompileGeneratedClasses {
+        options.errorprone {
+            // JMH generates duplicate field names like byte p000, p001, p002
+            disable("HidingField")
+        }
+    }
+}
+
+jmh {
+    // Add memory allocation profiling by default
+    profilers.add("gc")
+}
+
+// See https://github.com/melix/jmh-gradle-plugin
+// Unfortunately, current jmh-gradle-plugin does not allow to customize jmh parameters from the
+// command line, so the workarounds are:
+// a) Build and execute the jar itself: ./gradlew jmhJar && java -jar build/libs/calcite-...jar JMH_OPTIONS
+// b) Execute benchmarks via .main() methods from IDE (you might want to activate "power save mode"
+//    in the IDE to minimize the impact of the IDE itself on the benchmark results)
+
+tasks.withType<JavaExec>().configureEach {
+    // Execution of .main methods from IDEA should re-generate benchmark classes if required
+    dependsOn("jmhCompileGeneratedClasses")
+    doFirst {
+        // At best jmh plugin should add the generated directories to the Gradle model, however,
+        // currently it builds the jar only :-/
+        // IntelliJ IDEA "execute main method" adds a JavaExec task, so we configure it
+        classpath(File(buildDir, "jmh-generated-classes"))
+        classpath(File(buildDir, "jmh-generated-resources"))
+    }
+}
diff --git a/build-logic/jvm/src/main/kotlin/build-logic.jvm-library.gradle.kts b/build-logic/jvm/src/main/kotlin/build-logic.jvm-library.gradle.kts
index 7f5f0315fd..1b38aec829 100644
--- a/build-logic/jvm/src/main/kotlin/build-logic.jvm-library.gradle.kts
+++ b/build-logic/jvm/src/main/kotlin/build-logic.jvm-library.gradle.kts
@@ -26,3 +26,7 @@ if (file("src/main/groovy").isDirectory || file("src/test/groovy").isDirectory)
 if (file("src/main/kotlin").isDirectory || file("src/test/kotlin").isDirectory) {
     apply(plugin = "build-logic.kotlin")
 }
+
+if (file("src/jmh").isDirectory) {
+    apply(plugin = "build-logic.jmh")
+}
diff --git a/checksum.xml b/checksum.xml
index 825c6a90d3..ac89439db4 100644
--- a/checksum.xml
+++ b/checksum.xml
@@ -116,6 +116,7 @@
     <trusted-key id='1aa8cf92d409a73393d0b736bff2ee42c8282e76' group='org.apache.activemq' />
     <trusted-key id='8da70c00df7af1b0d2f9dc74ddbcc1270a29d081' group='org.apache.ant' />
     <trusted-key id='2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb' group='org.apache.bcel' />
+    <trusted-key id='12d16069219c90212a974d119ae296fd02e9f65b' group='org.apache.commons' />
     <trusted-key id='2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb' group='org.apache.commons' />
     <trusted-key id='3692c12c7e3d336a452beb254e066e0459cd109b' group='org.apache.commons' />
     <trusted-key id='41a1a08c62fca78b79d3081164a16faaec16a4be' group='org.apache.commons' />
@@ -180,6 +181,7 @@
     <trusted-key id='e9af5293c334c7c0b583227d2f45f85cdf082e68' group='org.mozilla' />
     <trusted-key id='07a4fa67a8222f1b39f9edaef8052e4e1bd0db31' group='org.neo4j.driver' />
     <trusted-key id='e85aed155021af8a6c6b7a4a7c7d8456294423ba' group='org.objenesis' />
+    <trusted-key id='019082bc00e0324e2aef4cf00d3b328562a119a7' group='org.openjdk.jmh' />
     <trusted-key id='ff6e2c001948c5f2f38b0cc385911f425ec61b51' group='org.opentest4j' />
     <trusted-key id='a5bd02b93e7a40482eb1d66a5f69ad087600b22c' group='org.ow2.asm' />
     <trusted-key id='908366594e746bf3c449f5622be5d98f751f4136' group='org.pcollections' />
@@ -258,6 +260,9 @@
     <dependency group='javax.inject' module='javax.inject' version='1'>
       <sha512>E126B7CCF3E42FD1984A0BEEF1004A7269A337C202E59E04E8E2AF714280D2F2D8D2BA5E6F59481B8DCD34AAF35C966A688D0B48EC7E96F102C274DC0D3B381E</sha512>
     </dependency>
+    <dependency group='me.champeau.jmh' module='jmh-gradle-plugin' version='0.7.1'>
+      <sha512>D0B6A85CA7261FCEF0B2796F8FAD16C1044822AFE5ECD896B1103D7015FF690E806EC969B01150E9CA3FF96607AB53B6468ED2D5F3260C019CAE953B2291E7A4</sha512>
+    </dependency>
     <dependency group='net.jcip' module='jcip-annotations' version='1.0'>
       <sha512>CB312B3F571D91EF183C119D878F50464FFD97F853B7311CBA386463F295E8B7B3A5A89ED4269A045CACD5AA7CB4C803D4882854A0FDDEFA9BBC28C72AA6C786</sha512>
     </dependency>
@@ -306,12 +311,18 @@
     <dependency group='org.jetbrains.kotlinx' module='atomicfu' version='0.17.3'>
       <sha512>A3E69E3B8416E71842921D439A45BCE30BD00043E17923B5071A298C79F4914B1CB1FAA8DAA779CBC234B576AA54A3DE4D816C2BD7E4C2712A119C357027C2B9</sha512>
     </dependency>
+    <dependency group='org.jetbrains.kotlinx' module='atomicfu' version='0.20.2'>
+      <sha512>8B31FEED38FCEE2CBD0705587D0E960DA508ED59F2EC51EB1C4789F3093937F5B0CF87C21B13967AB22E718E7FBFF7BD3CA4B4D0CA872EB408448583E3F45C8F</sha512>
+    </dependency>
     <dependency group='org.jetbrains.kotlinx' module='kotlinx-coroutines-core' version='1.6.1'>
       <sha512>44A5D6F34DB9A4BAE1C11CA10563F3A25F1C6A8F681ABD31C530C7D36C9B001AB6F345F0AB5E2AFD94AD5AB436C06D12D7B1AD9EB7F12DB3EF9487D692107921</sha512>
     </dependency>
     <dependency group='org.jetbrains.kotlinx' module='kotlinx-coroutines-core' version='1.6.4'>
       <sha512>626213318BD0605586FC693969765FAE3BB15D2BCBBACB597C6E32AA1BDEF6430980480B6732556FCD93DE1E6BA99F9E050141AD59259AAE386D8D05A3C44C27</sha512>
     </dependency>
+    <dependency group='org.jetbrains.kotlinx' module='kotlinx-coroutines-core' version='1.7.1'>
+      <sha512>89CA3D64D42938DCB50AC58CD53D1DAEAF6EA0BF69CC01DEFE7467D2D1F23BE7932D005861A6E08C2C81980EE1F8EFB9A944B939FE02AF99518753704383C086</sha512>
+    </dependency>
     <dependency group='org.nosphere.apache' module='creadur-rat-gradle' version='0.8.0'>
       <sha512>F9C0C770036768965D955BF849933DFA1B5805959D0C93C2C70DA31D67C200140CAC7B9B93CF28B3F86AA3A5993DD25D566E37B0C451264CB0F6F2B5CD88F760</sha512>
     </dependency>
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc b/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc
new file mode 100644
index 0000000000..5a57652271
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/12d16069219c90212a974d119ae296fd02e9f65b.asc
@@ -0,0 +1,26 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBEzH8KcBEADyHAdW2cHj2SfvmdAG3yG0NIlfdSWXG06k7BGUatjNfaIGHVSv
+r0U3WlGlUowiLqPhZfQf3v/tvd7yDKZ1Tk3p3A3rEVEZQ26u/o66QgTNjl15YmaR
+W6/+MOieKsNTghAogNiTOp6dgrFn6Uw2iCFgRUr8Z8dPUSRwtoPtw359nyIIllEf
+lBt8ZPbmTZ3rn6y9TYviFIbO+pIVc5iGuHCyr+9NXdOpNKpUKd4h2TLtixtcNWY0
+6TRLhbd4COwZVL9ZZwAlyKhQ4TbvvKvVCS9+HPd9onQ55s9iqUTA9xeRW3D5aVOA
+0VgXrFnAq5HE2x7+j1qZQRqMNpVTDgUptpDG5lj7rIdgMaYj+vL/bgmK8thg9su4
+8TdPgza1ex5Q4Hb0tbxg/H7Ucasxys0MJ9ktG91vgR0oHP0y0Lf/3uyoCyhKilKO
+yDqkKFeKcTx9TCZfV29gDs4dumH1Eirpg5ikKjPExhaITZgtV401CDsS+DgXHqEk
+YN9R59qJ27AUV6J3dAAumzXECXBDcvyLdb7pEIBs5/QtdgE2ivCH8BwFlmcdqe0+
+uKL0jgylMDsfiADVhzagv899MqrmQh8po6Sj78G0gwdfCF9neZgX2czolSFYFSy0
+rmSwUetem6IPwaXpV5r3852P+MqEvI2s86c3ZIyGFO0ltK5KSZq62DANqwARAQAB
+uQINBEzH8KcBEAC+7OdU8Xc38u7HpPQQPAmBHw5UIACUFP3/xrsh6dDj2B0TMlsb
+mKP1MDAN3qb9lwci2NEUgLKWrByQdTMMYfOuJuGwFYZ2gU0awpvaD4mb07gQ8qxV
+pHfpHSdpLMYscViIKhTcqAY4RIB85FUN26F8lpetQ93kKxSegMdLW1kwB9UTH6ik
+86hvTCT5ggbupzWdsUh1Sd+0UJBpgLn+NBQwjv7pzPVdSx8+9XA/G77iZPNeVihe
+VTtUfoubpN3BpKoRrJVieZX8YjF2RJmzSjPBzt4mLKPec8AGPxDzc7f4/NXX445k
+BkOyDJCQxwCTHjmF1LEJbxipdPTGrWiIw467U1LrFCsuqc+ewGJBZWMkXEWWMzQF
+axbIDKy8txnTgi9nkEYW/s0QjXa7+1jWUye52aVsBpNc5t/bh4JxJ53u5qcXwQYP
+hTL0o2pXkgoXpRAbwhoZ1IpRGL+FMyAONYdEPRtv4Q4udUQx3DEeNZw3oMpXHHFd
+S7KUiLhQfESgHyR7kugpZYwbCQO+feSCWys3rMKL3s+8kQq8LqjG/xXOLiLJRDku
+7n/y9FUWZzNCgpx8pftU3bQRpDLA7yow8FXRoeQbmSM4aVydYJhaehYRoEmrlJ0R
+MwlnG0OV7kgTipJgaxaBfrxP2N8Khgf4dbhdxslkZPmpD6+scgT2U6MgqwARAQAB
+=tJcb
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints
new file mode 100644
index 0000000000..3145005c70
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/5b/9ae296fd02e9f65b.fingerprints
@@ -0,0 +1 @@
+12d16069219c90212a974d119ae296fd02e9f65b
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints
new file mode 100644
index 0000000000..78a0517548
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/71/c45d01093dcfc371.fingerprints
@@ -0,0 +1 @@
+019082bc00e0324e2aef4cf00d3b328562a119a7
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc b/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc
new file mode 100644
index 0000000000..24e073b181
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/019082bc00e0324e2aef4cf00d3b328562a119a7.asc
@@ -0,0 +1,26 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBE4rG7gBEADo5n849j3hlKrvFzt6y65grIxTlbLDXEB7+6sw0Xwuh4NrK/Zg
+0+eF0vvCCZrl3lHE2duD2ng9ZXz8EvUSNfwKMQz+cwF0klhP92u6mykKJ3/DZ4yo
+wojLPkIr5tVo4ybeVIbQ3N4+FnqzpNfs571KZHUOa2unwdgGK7OGMTxTkP8oaRwP
+H5VenaKoknbLbp2CUchQT3pkv3Yio+NIDGgZ1VmgOTqczI2KZe1viqRY32rBVKr1
+684Bgygf0ZfzMyKd1xK5UvDGhfQU+uDZrV9f81YMqJ9dZFjbZsyIhsEtIloTp0/Y
+kDtUMlkXF1c8EExpqTEUwEBwV+ow3IKVv3YDNNpZ8g8TQa7wKcpOia7UmEdXraY6
+PdP5tzClCqV0PqOxdNh+En9tw3VNKqAjQ9EE/nSbRz5d0JgdIA6SfPeXqAK5hxuT
+fdOdleywcOa1HRVN4xoEsOljfQiS1dz2xzou0mR1NpnD4PuGRdx4wwYGmkqulbbt
+1wQJRd/psyFfnpxrqk9I4frouzxMcrPUDH+T5qAVfkX3LG5XRGFkScWbZ65SXXB6
+wg6DsFNUXl1is01Wfda0TvBXdjO19RdcVSyD/DlAlXukmQb36Av3pHatR5Y8k7xN
+c1tU4G6dSfiD/JjwnCTzfqmHBnS4c2d1JKscPGRy+Y82Ghj2lPmunn6D9QARAQAB
+uQINBE4rG7gBEADdSXw7MJF5zFEN7siT74kGxyBO40gfhW2HTIbGXyUHKGpknHOH
+V3KYS0GEtvLc8QGOHv5qLfYlCejD5cYpzoDcWIUo1KZiaqG6LulcAy8sDuX3o5z0
+LpUikutXeIxGTgxdpc3SfYPhb43ir6pPI42MhgFOOAAhHLo9yE24G5FYna5S5OZx
+eOWiwelhYUxBMTIyA+vwCUii91ZSO5ByPU9d0QJBS2Y1Xwp0SDDa5z1x+SYRx1XO
+a8aD7/tb+K1G+giuedY5J2eVKvxFB0ABqdTNT1tj9bZmXqfKEjpaziXa9WVSNNU0
+De6IYZFsDJ9yC/3mYBB4rNd3iqQnlH6bTIaSWGA1I13JZQUm0dJet9IwxP7rCgM8
+lSsPXjvdTvHZItIIYQaMihUp3360G16ESiVRXIXwRyUztm9MMNhVzTkFXkJ9G5WX
++3Og8inNjzJViJGfqgZ4KNlXql9/BtqlsPcmTeMoZf2LCz86uTfUrhf18AVJJq2E
+B/R9M+TWQ7R9SEpQ49RoZUfVXb/HKVnWw9OjJyGFhc58MBGyT1VNGpvwDEzceJfG
+ri71lnyCAddNc10wNyfeF069wVoGTZyWklWgC7UB6dUn+9TYN2/ZpHtDzzdAoEOp
+pFdqib0+xfeY0mt9k0/jPvK2wqXMY3Vi2nvVDQNUEEJxMLSFBiqAA88EDwARAQAB
+=ZVwp
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints
new file mode 100644
index 0000000000..78a0517548
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/a7/0d3b328562a119a7.fingerprints
@@ -0,0 +1 @@
+019082bc00e0324e2aef4cf00d3b328562a119a7
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints
new file mode 100644
index 0000000000..3145005c70
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/e3/2f3c9eeb05d1d1e3.fingerprints
@@ -0,0 +1 @@
+12d16069219c90212a974d119ae296fd02e9f65b
diff --git a/src/bom-testing/build.gradle.kts b/src/bom-testing/build.gradle.kts
index 0812deffa6..272decda05 100644
--- a/src/bom-testing/build.gradle.kts
+++ b/src/bom-testing/build.gradle.kts
@@ -52,6 +52,8 @@ dependencies {
         api("org.hamcrest:hamcrest:2.2")
         api("org.hsqldb:hsqldb:2.7.1")
         api("org.objenesis:objenesis:3.3")
+        api("org.openjdk.jmh:jmh-core:1.36")
+        api("org.openjdk.jmh:jmh-generator-annprocess:1.36")
         api("org.spockframework:spock-core:2.3-groovy-3.0")
         api("org.springframework:spring-beans:4.3.30.RELEASE")
         api("org.springframework:spring-context:4.3.30.RELEASE")
diff --git a/src/core/src/jmh/java/org/apache/jmeter/reporters/ResultCollectorBenchmark.java b/src/core/src/jmh/java/org/apache/jmeter/reporters/ResultCollectorBenchmark.java
new file mode 100644
index 0000000000..60f07a7bc0
--- /dev/null
+++ b/src/core/src/jmh/java/org/apache/jmeter/reporters/ResultCollectorBenchmark.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.reporters;
+
+import java.util.concurrent.TimeUnit;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+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.annotations.Warmup;
+import org.openjdk.jmh.profile.GCProfiler;
+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;
+
+@Fork(value = 1, jvmArgsPrepend = {"-Xmx128m"})
+@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@State(Scope.Thread)
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class ResultCollectorBenchmark {
+    ResultCollector collector;
+
+    @Param("true")
+    boolean success;
+
+    @Setup
+    public void setup() {
+        collector = new ResultCollector();
+        collector.setName("Sample colelctor");
+        collector.setComment("Comment");
+        collector.setRunningVersion(true);
+    }
+
+    @Benchmark
+    public boolean isSampleWanted() {
+        return collector.isSampleWanted(success);
+    }
+
+    public static void main(String[] args) throws RunnerException {
+        Options opt = new OptionsBuilder()
+                .include(ResultCollectorBenchmark.class.getSimpleName())
+                .addProfiler(GCProfiler.class)
+                .detectJvmArgs()
+                .build();
+        new Runner(opt).run();
+    }
+}
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleSaveConfiguration.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleSaveConfiguration.java
index b43278448f..2aff60a108 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleSaveConfiguration.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleSaveConfiguration.java
@@ -283,6 +283,10 @@ public class SampleSaveConfiguration implements Cloneable, Serializable {
     // Read in the properties having to do with saving from a properties file.
     static {
         Properties props = JMeterUtils.getJMeterProperties();
+        if (props == null) {
+            // If properties are not initialized, proceed with defaults
+            props = new Properties();
+        }
 
         SUB_RESULTS      = TRUE.equalsIgnoreCase(props.getProperty(SUBRESULTS_PROP, TRUE));
         ASSERTIONS      = TRUE.equalsIgnoreCase(props.getProperty(ASSERTIONS_PROP, TRUE));
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index 75293c340c..fdb4faa17b 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -139,6 +139,7 @@ Summary
   <li>Update lets-plot-jvm to 4.3.0 (from 3.1.1)</li>
   <li>Update lets-plot-batik to 3.1.0 (from 2.1.1)</li>
   <li>Added randomized test GitHub Actions matrix for better coverage of locales and time zones</li>
+  <li><pr>5960</pr>Add OpenJDK JMH for creating microbenchmarks in JMeter code</li>
 </ul>
 
  <!-- =================== Bug fixes =================== -->