/* * 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 MVELBenchmark extends AbstractBenchmark { final protected String mel = "mel:StringBuilder sb = new StringBuilder(); fields = payload.split(',\');" + "if (fields.length > 4) {" + " sb.append(' <Contact>\n');" + " sb.append(' <FirstName>').append(fields[0]).append('</FirstName>\n');" + " sb.append(' <LastName>').append(fields[1]).append('</LastName>\n');" + " sb.append(' <Address>').append(fields[2]).append('</Address>\n');" + " sb.append(' <TelNum>').append(fields[3]).append('</TelNum>\n');" + " sb.append(' <SIN>').append(fields[4]).append('</SIN>\n');" + " sb.append(' </Contact>\n');" + "}" + "sb.toString();"; final protected String payload = "Tom,Fennelly,Male,4,Ireland"; 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); } @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)); } /** * 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); } }