/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.el.mvel;
import static org.mule.runtime.core.api.config.MuleProperties.OBJECT_EXPRESSION_LANGUAGE;
import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.stopIfNeeded;
import org.mule.AbstractBenchmark;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.construct.Flow;
import org.mule.runtime.core.api.scheduler.SchedulerService;
import org.mule.runtime.core.el.mvel.MVELExpressionLanguage;
import java.util.Random;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.TearDown;
public class MVELDeepInvokeBenchmark extends AbstractBenchmark {
final protected String mel = "mel:payload.setFirstName('Tom');"
+ "payload.setLastName('Fennelly');"
+ "payload.contact.setAddress('Male');"
+ "payload.contact.setTelnum('4');"
+ "payload.setSin('Ireland');"
+ "payload;";
final protected Payload payload = new Payload();
private MuleContext muleContext;
private Flow flow;
private Event event;
@Setup
public void setup() throws MuleException {
muleContext = createMuleContextWithServices();
((MVELExpressionLanguage) muleContext.getRegistry().lookupObject(OBJECT_EXPRESSION_LANGUAGE)).setAutoResolveVariables(false);
flow = createFlow(muleContext);
event = createEvent(flow, payload);
}
@TearDown
public void teardown() throws MuleException {
stopIfNeeded(muleContext.getRegistry().lookupObject(SchedulerService.class));
muleContext.dispose();
}
/**
* Cold start: - New expression for each iteration - New context (message) for each iteration
*/
@Benchmark
public Object mvelColdStart() {
return muleContext.getExpressionManager().evaluate(mel + new Random().nextInt(), createEvent(flow, payload));
}
/**
* Warm start: - Same expression for each iteration - New context (message) for each iteration
*/
@Benchmark
public Object mvelWarmStart() {
return muleContext.getExpressionManager().evaluate(mel, event);
}
/**
* Hot start: - Same expression for each iteration - Same context (message) for each iteration
*/
@Benchmark
public Object mvelHotStart() {
return muleContext.getExpressionManager().evaluate(mel, event);
}
public static class Payload {
public String firstName;
public String lastName;
public Contact contact = new Contact();
public String sin;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSin() {
return sin;
}
public void setSin(String sin) {
this.sin = sin;
}
}
public static class Contact {
public String address;
public String telnum;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelnum() {
return telnum;
}
public void setTelnum(String telnum) {
this.telnum = telnum;
}
}
}