package org.togglz.benchmark;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.profile.GCProfiler;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.togglz.core.Feature;
import org.togglz.core.activation.ScriptEngineActivationStrategy;
import org.togglz.core.context.FeatureContext;
import org.togglz.core.context.StaticFeatureManagerProvider;
import org.togglz.core.manager.FeatureManager;
import org.togglz.core.manager.FeatureManagerBuilder;
import org.togglz.core.repository.FeatureState;
import org.togglz.core.repository.mem.InMemoryStateRepository;
import org.togglz.core.user.NoOpUserProvider;
import java.util.concurrent.TimeUnit;
/**
* Benchmark the performance of the ScriptEngine-based activation strategy in
* terms of speed and memory footprint
*
* @author Ryan Gardner
* @date 5/13/16
*/
@State(Scope.Benchmark)
@BenchmarkMode({Mode.Throughput, Mode.SampleTime, Mode.SingleShotTime})
@Measurement(iterations = 4, time = 10, timeUnit = TimeUnit.SECONDS)
@Threads(7)
@Warmup(iterations = 4, time = 5, timeUnit = TimeUnit.SECONDS)
public class ScriptEngineActivationStrategyBenchmark {
FeatureManager manager;
// a simple feature for this benchmark
private enum ScriptEngineActivationStrategyFeatures implements Feature {
ALWAYS_TRUE_SCRIPT_ENGINE_ACTIVATION_STRATEGY,
DISABLED_FEATURE,
DYNAMIC_SCRIPT_ENGINE_STRATEGY;
public boolean isActive() {
return FeatureContext.getFeatureManager().isActive(this);
}
}
// create an in-memory state repository for our feature
@Setup(Level.Trial)
public void setupFeatureManager() {
FeatureManager featureManager = new FeatureManagerBuilder()
.featureEnums(ScriptEngineActivationStrategyFeatures.class)
.stateRepository(new InMemoryStateRepository())
.userProvider(new NoOpUserProvider())
.build();
// set up the toggle activation state
StaticFeatureManagerProvider.setFeatureManager(featureManager);
manager = featureManager;
FeatureState alwaysTrueScriptEngineFeatureState = new FeatureState(ScriptEngineActivationStrategyFeatures.ALWAYS_TRUE_SCRIPT_ENGINE_ACTIVATION_STRATEGY);
alwaysTrueScriptEngineFeatureState.setEnabled(true);
alwaysTrueScriptEngineFeatureState.setStrategyId(ScriptEngineActivationStrategy.ID);
alwaysTrueScriptEngineFeatureState.setParameter(ScriptEngineActivationStrategy.PARAM_LANG, "nashorn");
alwaysTrueScriptEngineFeatureState.setParameter(ScriptEngineActivationStrategy.PARAM_SCRIPT, "true");
FeatureState dynamicScriptEngineState = new FeatureState(ScriptEngineActivationStrategyFeatures.DYNAMIC_SCRIPT_ENGINE_STRATEGY);
dynamicScriptEngineState.setEnabled(true);
dynamicScriptEngineState.setStrategyId(ScriptEngineActivationStrategy.ID);
dynamicScriptEngineState.setParameter(ScriptEngineActivationStrategy.PARAM_LANG, "nashorn");
dynamicScriptEngineState.setParameter(ScriptEngineActivationStrategy.PARAM_SCRIPT, "Math.random() < Math.pow(1 - (27 - date.getDate()) * 0.2, 3)");
manager.setFeatureState(alwaysTrueScriptEngineFeatureState);
manager.setFeatureState(dynamicScriptEngineState);
}
@Benchmark
public int scriptEngineThatAlwaysReturnsTrue() {
return (manager.isActive(ScriptEngineActivationStrategyFeatures.ALWAYS_TRUE_SCRIPT_ENGINE_ACTIVATION_STRATEGY)) ? 0 : 1;
}
@Benchmark
public int scriptEngineDoingDynamicThings() {
return (manager.isActive(ScriptEngineActivationStrategyFeatures.DYNAMIC_SCRIPT_ENGINE_STRATEGY)) ? 0 : 1;
}
@Benchmark
public int disabledFeatureWithNoScriptEngineInvolved() {
return (manager.isActive(ScriptEngineActivationStrategyFeatures.DISABLED_FEATURE)) ? 0 : 1;
}
// run this method to execute this test
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(ScriptEngineActivationStrategyBenchmark.class.getSimpleName())
.addProfiler(GCProfiler.class)
.build();
new Runner(opt).run();
}
}