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