Concise way to compare runtime of alternate implementations

vyazelenko at yahoo.com vyazelenko at yahoo.com
Thu Feb 26 07:16:11 UTC 2015


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