ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-10031: [CI][Java] Support Java benchmark in Archery - #8210

Closed
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031
Closed

ARROW-10031: [CI][Java] Support Java benchmark in Archery#8210
kiszk wants to merge 14 commits into
apache:masterfrom
kiszk:ARROW-10031

Conversation

@kiszk

@kiszkkiszk commented Sep 17, 2020

Copy link
Copy Markdown
Member

This PR supports Java benchmark in Ursabot. The implementation is based on this suggestion

Here are work items.

  • Support --language=[cpp|java] option in diff
  • Enable to build java binding
  • Enable to run Java benchmarks
  • Allows us to filter/select benchmarks
  • Enable to collect results
  • Apply the same changes to run and list

@github-actions

Copy link
Copy Markdown

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from d719b0d to 0e47ab6CompareSeptember 22, 2020 00:36
@liyafan82

Copy link
Copy Markdown
Contributor

@kiszk Thank you for doing this.
Please note that when running the benchmarks, some flags should be configured properly.
They can be set through environmental variables:

ARROW_ENABLE_UNSAFE_MEMORY_ACCESS = true
ARROW_ENABLE_NULL_CHECK_FOR_GET = false

or through system properties:

arrow.enable_unsafe_memory_access = true
arrow.enable_null_check_for_get = false

@kiszk

kiszk commented Sep 23, 2020

Copy link
Copy Markdown
MemberAuthor

@liyafan82 Thank you for your comment. I will set these two properties as default for Java benchmarking
.

@kiszk

Copy link
Copy Markdown
MemberAuthor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@liyafan82

Copy link
Copy Markdown
Contributor

At my end, I can generate the following JSON file by archery benchmark diff --language=java ...

@liyafan82 any comments regarding format and parameters are appreciated.

 benchmark baseline contender change % counters
0 org.apache.arrow.vector.IntBenchmarks.setIntDirectly 22.500 us/op 11.209 us/op -50.182 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
2 org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 19.031 us/op 6.627 us/op -65.179 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
1 org.apache.arrow.vector.IntBenchmarks.setWithWriter 32.626 us/op 10.246 us/op -68.594 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 4, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk Thanks for your effort. Generally, it looks great! Some minor comments:

  1. It is clearer to rename title 'counters' to 'configuration'?
  2. I am curious how are the benchmarks sorted, by 'change %'?

@kiszk

Copy link
Copy Markdown
MemberAuthor

For 1., I will rename the title for cpp and Java.

For 2, you are right as sorted here.

@kiszk
kiszkforce-pushed the ARROW-10031 branch 3 times, most recently from 3ebd9f6 to 8cdd1eaCompareNovember 13, 2020 01:32
@kiszk
kiszk marked this pull request as ready for review November 13, 2020 04:59
@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82@fsaintjacques@kszucs Would it be possible to review this?

@kiszk

Copy link
Copy Markdown
MemberAuthor

The following commands should work:

archery benchmark list --langauge=java
archery benchmark run --langauge=java
archery benchmark diff --langauge=java

Here is an example

archery benchmark run ARROW-10031 --output=out-java.json --language=java --benchmark-filter=IntBench --java-options=-mx1g --build-extras=-Dfoo.bar=1 --benchmark-extras=-Dbar.foo=2

Comment threadjava/performance/pom.xml Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liyafan82 Here is a change from #8245 . Since I cannot find to add -rf json or not to add it in <arguments>, the current implementation always generates jmh-result.json and change a file name if it will be overridden.

I would like to update here if there is a selection method to add -rf json or not to add it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good. Thanks.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@liyafan82

Copy link
Copy Markdown
Contributor

The Java changes look good to me. However, I am not farmiliar with the archery code. So @fsaintjacques@kszucs could you please take a look?

@kszucskszucs changed the title ARROW-10031: [CI][Java] Support Java benchmark in UrsabotARROW-10031: [CI][Java] Support Java benchmark in ArcheryDec 21, 2020
@kszucs

Copy link
Copy Markdown
Member

Thanks for working on this! At the moment we can only try this out locally since we no longer maintain the buildbot/ursabot setup. I have limited time to review this, so I'd say that if the benchmarking using archery works locally then is should be good to go.

@kiszk

kiszk commented Jan 11, 2021

Copy link
Copy Markdown
MemberAuthor

I see. Thank you for sharing the latest status.

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@xhochy May I ask to review this if possible?

@xhochy

Copy link
Copy Markdown
Member

Leaving this for @bkietz , archery is not my area of expertise.

@bkietz
bkietz self-requested a review January 11, 2021 15:58

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general, I'd recommend refactoring for less repetition of code between the classes for handling java and C++ builds

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, please convert to "items_per_second" or "bytes_per_second" in JavaMicrobenchmarkHarnessObservation.unit

Comment threaddev/archery/archery/benchmark/jmh.py Outdated
Comment on lines 36 to 37

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment doesn't apply to java benchmarks; seems copy pasted from GoogleBenchmarkCommand?

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please put docstrings on the first line of function definitions

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, please make it clear that you're using the strings "Benchmarks:" and "[INFO]" to delimit lines containing benchmark names

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
benchmarks = False

Comment threaddev/archery/archery/benchmark/jmh.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's odd that this class inherits Maven instead of Command, especially since it has a member self.maven

Suggested change
classJavaMicrobenchmarkHarnessCommand(Maven):
classJavaMicrobenchmarkHarnessCommand(Command):

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division seems unnecessary. Please just keep a single benchmark_list function (moving the branch on language into the with block)

Comment threaddev/archery/archery/lang/java.py Outdated
Comment on lines 46 to 52

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend doing the cast-to-list here; if an iterator were passed for build_extras then it'd be depleted after the first access to build_definitions:

Suggested change
self.build_extras=build_extras
self.benchmark_extras=benchmark_extras
@property
defbuild_definitions(self):
extras=list(self.build_extras) ifself.build_extraselse []
returnextras
self.build_extras=list(build_extras) ifbuild_extraselse []
self.benchmark_extras=list(benchmark_extras) ifbenchmark_extraselse []
@property
defbuild_definitions(self):
returnself.build_extras

I see that CppConfiguration has this same flaw; it's not necessary for you to address it there too

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This division also seems unnecessary; CppBenchmarkRunner and JavaBenchmarkRunner seem similar enough to share more code here

Comment threaddev/archery/archery/cli.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, why separate the languages' benchmarks? It seems especially valuable to have a clearly unified strategy for comparison of benchmarks

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This separation comes from @click.pass_context. To use different options between two languages (e.g. java-home or cxx-flags), my understanding was that we need different methods with the @click.pass_context.

Let me try to have one method with @click.pass_context by lazily parse arguments for each language.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
directory. Ifso, itcreatesaJavaenchmarkRunnerwiththisexisting
directory. Ifso, itcreatesaJavaBenchmarkRunnerwiththisexisting

Again, seems like this code didn't need to be repeated

@emkornfield

Copy link
Copy Markdown
Contributor

@kiszk@bkietz are there more revisions needed here? (it looks like this at least needs a rebase?)

@kiszk

kiszk commented Feb 1, 2021

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz Thank you for kind ping. Yes, I need an update since I was swamped last month. I will update this PR this week.

@emkornfield

Copy link
Copy Markdown
Contributor

CC @dianaclarke who I think has also been working on continuous benchmarking.

@kiszk

Copy link
Copy Markdown
MemberAuthor

Here is an example.

% archery benchmark diff --language=java --benchmark-filter="setWith" HEAD HEAD~1
...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Non-regressions: (2)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
benchmark baseline contender change % configurations
org.apache.arrow.vector.IntBenchmarks.setWithValueHolder 165.925K items/sec 165.898K items/sec -0.016 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}
org.apache.arrow.vector.IntBenchmarks.setWithWriter 222.780K items/sec 221.768K items/sec -0.454 {'mode': 'avgt', 'threads': 1, 'warmups': 5, 'warmupTime': '10 s', 'measurements': 1, 'measurementTime': '10 s', 'jvmArgs': ['-Darrow.enable_null_check_for_get=false -Darrow.enable_unsafe_memory_access=true']}

@kiszk

Copy link
Copy Markdown
MemberAuthor

@emkornfield@bkietz@dianaclarke@liyafan82 I am very sorry for being late to address review comments.

Now, I addressed all of the comments and rebased with the master. Would it be possible to review this PR again?

@kszucs

Copy link
Copy Markdown
Member

@ursabot --help

@ursabot

Copy link
Copy Markdown

Supported benchmark command examples:

@ursabot benchmark help

To run all benchmarks:
@ursabot please benchmark

To filter benchmarks by language:
@ursabot please benchmark lang=Python
@ursabot please benchmark lang=C++
@ursabot please benchmark lang=R

To filter Python and R benchmarks by name:
@ursabot please benchmark name=file-write
@ursabot please benchmark name=file-write lang=Python
@ursabot please benchmark name=file-.*

To filter C++ benchmarks by archery --suite-filter and --benchmark-filter:
@ursabot please benchmark command=cpp-micro --suite-filter=arrow-compute-vector-selection-benchmark --benchmark-filter=TakeStringRandomIndicesWithNulls/262144/2 --iterations=3

For other command=cpp-micro options, please see https://github.com/ursacomputing/benchmarks/blob/main/benchmarks/cpp_micro_benchmarks.py

@kszucs

Copy link
Copy Markdown
Member

@ursabot please benchmark lang=C++

@ursabot

ursabot commented Apr 14, 2021

Copy link
Copy Markdown

@kszucs

Copy link
Copy Markdown
Member

I wouldn't be too pedantic here, we can address any issues later. Nice addition, thanks @kiszk!

I submitted a conbench build to check that the archery benchmark command remained compatible.

@emkornfield

emkornfield commented Apr 25, 2021

Copy link
Copy Markdown
Contributor

Should this be merged?

@ursabot

ursabot commented Apr 25, 2021

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 5b08205 and contender = 5d70561. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-large-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️2.08% ⬆️2.14%] ursa-thinkcentre-m75q

@kiszk

Copy link
Copy Markdown
MemberAuthor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

@liyafan82

Copy link
Copy Markdown
Contributor

@bkietz@dianaclarke@liyafan82 Would you have additional comments?

I have no more comments. Hope this PR will be merged soon.

kou
kou approved these changes Apr 30, 2021

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

If wee need more refactoring, we can work on it as a follow-up task.

@koukou closed this in 2ece340Apr 30, 2021
@kiszk

kiszk commented May 1, 2021

Copy link
Copy Markdown
MemberAuthor

Thanks very much for your comments

pribor pushed a commit to GlobalWebIndex/arrow that referenced this pull request Oct 24, 2025
This PR supports Java benchmark in Ursabot. The implementation is based on [this suggestion](https://mail-archives.apache.org/mod_mbox/arrow-dev/202008.mbox/%3cCABNn7+q35j7QWsHJBX8omdewKT+F1p_M7r1_F6szs4dqc+Luyg@mail.gmail.com%3e)
Here are work items.
- [x] Support `--language=[cpp|java]` option in `diff`
- [x] Enable to build java binding
- [x] Enable to run Java benchmarks
- [x] Allows us to filter/select benchmarks
- [x] Enable to collect results
- [x] Apply the same changes to `run` and `list`
Closesapache#8210 from kiszk/ARROW-10031
Authored-by: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@kiszk@liyafan82@kszucs@xhochy@emkornfield@ursabot@kou@bkietz