Concise way to compare runtime of alternate implementations

Aleksey Shipilev aleksey.shipilev at oracle.com
Thu Feb 26 07:33:37 UTC 2015


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