Concise way to compare runtime of alternate implementations
Aleksey Shipilev
aleksey.shipilev at oracle.com
Fri Feb 27 11:05:40 UTC 2015
Great, can you (self?)-answer the StackOverflow question then?
http://stackoverflow.com/questions/28732946/jmh-benchmarking-concise-way-to-compare-runtime-of-alternate-implementations
Thanks,
-Aleksey.
On 26.02.2015 22:11, Keith Newman wrote:
> Both the Enum and abstract implementations did the trick. Thanks
> Aleksey and Dmitry!
>
> Best,
> Keith
>
> On 2/25/2015 11:33 PM, Aleksey Shipilev wrote:
>> Ah yes, dang it, I misread Keith's requirement.
>
>> Yes, you can parametrize over different implementations, either
>> with enum as Dmitry outlined below, or you may use inheritance:
>
>> http://hg.openjdk.java.net/code-tools/jmh/file/bdfc7d3a6ebf/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_24_Inheritance.java
>
>
>
> ...and do the @Setup in each particular concrete subclass.
>
>> -Aleksey.
>
>> On 02/26/2015 10:16 AM, vyazelenko at yahoo.com wrote:
>>> Hi Keith,
>>>
>>> If benchmarks are the same for every impl then you can simply
>>> add parameter which will tell which impl to instantiate. Then
>>> inside the @Setup method you'll create target instance based on
>>> that parameter: @Param private ImplType type; @Setup(Level.Trial)
>>> public void setUp() { switch(implType): case Impl1:
>>> impl=Utils.myClass1(); break; case Impl2: impl=Utils.myClass2();
>>> }
>>>
>>> @Benchmark public boolean contains_val() { return
>>> impl.contains(val); }
>>>
>>> This approach requires that your impls have common interface by
>>> which you'll refer to them in the benchmarks.
>>>
>>> Regards, Dmitry
>>>
>>> Sent from my iPhone
>>>
>>>> On Feb 26, 2015, at 07:20, Aleksey Shipilev
>>>> <aleksey.shipilev at oracle.com> wrote:
>>>>
>>>> Hi Keith,
>>>>
>>>>> On 02/26/2015 04:28 AM, Keith Newman wrote: I have two
>>>>> implementations of the same custom class:
>>>>>
>>>>> private List<String> a = Util.myCustomClass(); private
>>>>> List<String> b = Util2.myCustomClass();
>>>>>
>>>>> and would like to compare the runtime of each of their
>>>>> functions (which all have the same name). Currently, my
>>>>> benchmark tests look like:
>>>>>
>>>>> @Benchmark public boolean contains_val_a() { return
>>>>> a.contains(val); }
>>>>>
>>>>> @Benchmark public boolean contains_val_b() { return
>>>>> b.contains(val); }
>>>>>
>>>>> And I repeat this parallel structure for 25 or so different
>>>>> functions (writing each function twice because of the two
>>>>> implementations). Is there a way for me to only write the 25
>>>>> @Benchmark functions and have jmh run each function for both
>>>>> implementations?
>>>>
>>>> No, because JMH cannot guess what inputs to put into the
>>>> method. Figuring out what inputs are sensible to benchmark
>>>> with depends on the nature of the object under test, and I
>>>> don't think it could be / should be specified within the
>>>> harness.
>>>>
>>>> Thanks, -Aleksey.
>>>>
>>>>
>
>
>
More information about the jmh-dev
mailing list