package com.hubspot.jinjava.el; import static org.assertj.core.api.Assertions.assertThat; import java.util.Collection; import java.util.Map; import java.util.Set; import com.hubspot.jinjava.Jinjava; import com.hubspot.jinjava.interpret.Context; import com.hubspot.jinjava.interpret.JinjavaInterpreter; public class ExpressionResolverPerformanceTest { public static void main(String[] args) { PerformanceTester tester = new PerformanceTester(); tester.run(); } public static class PerformanceTester { private JinjavaInterpreter interpreter; private Context context; private long startTime; public PerformanceTester() { interpreter = new Jinjava().newInterpreter(); context = interpreter.getContext(); context.put("customMap", new CustomMap()); context.put("customObject", new CustomObject()); } public void run() { int iterations = 1000000; testMapResolver(iterations); testMethodResolver(iterations); } public void startTimer() { startTime = System.currentTimeMillis(); } public void stopTimer() { System.out.println(String.format("%d msec", System.currentTimeMillis() - startTime)); } public void testMapResolver(int iterations) { System.out.println("map resolver with " + iterations + " iterations"); startTimer(); for (int i = 0; i < iterations; i++) { Object val = interpreter.resolveELExpression("customMap.get(\"thing\")", -1); assertThat(val).isEqualTo("hey"); } stopTimer(); } public void testMethodResolver(int iterations) { System.out.println("method resolver with " + iterations + " iterations"); startTimer(); for (int i = 0; i < iterations; i++) { Object val = interpreter.resolveELExpression("customObject.getThing()", -1); assertThat(val).isEqualTo("hey"); } stopTimer(); } } static class CustomObject { public CustomObject() { } public String getThing() { return "hey"; } } static class CustomMap implements Map<String, String> { @Override public String get(Object key) { return "hey"; } @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean containsKey(Object key) { return false; } @Override public boolean containsValue(Object value) { return false; } @Override public String put(String key, String value) { return null; } @Override public String remove(Object key) { return null; } @Override public void putAll(Map<? extends String, ? extends String> m) { } @Override public void clear() { } @Override public Set<String> keySet() { return null; } @Override public Collection<String> values() { return null; } @Override public Set<Entry<String, String>> entrySet() { return null; } } }