From d8282d0126bc56f010cb29c452d6c61694fca7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20L=C3=A9aut=C3=A9?= Date: Fri, 16 May 2014 10:41:54 -0700 Subject: [PATCH] add JavascriptAggregatorBenchmark --- .../JavaScriptAggregatorBenchmark.java | 116 ++++++++++++++++++ .../aggregation/JavaScriptAggregatorTest.java | 28 +---- 2 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java diff --git a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java new file mode 100644 index 0000000000..8c9b10a563 --- /dev/null +++ b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorBenchmark.java @@ -0,0 +1,116 @@ +/* + * Druid - a distributed column store. + * Copyright (C) 2012, 2013, 2014 Metamarkets Group Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package io.druid.query.aggregation; + +import com.google.caliper.Runner; +import com.google.caliper.SimpleBenchmark; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import io.druid.segment.ObjectColumnSelector; + +import java.util.Map; + +public class JavaScriptAggregatorBenchmark extends SimpleBenchmark +{ + + protected static final Map scriptDoubleSum = Maps.newHashMap(); + static { + scriptDoubleSum.put("fnAggregate", "function aggregate(current, a) { return current + a }"); + scriptDoubleSum.put("fnReset", "function reset() { return 0 }"); + scriptDoubleSum.put("fnCombine", "function combine(a,b) { return a + b }"); + } + + private static void aggregate(TestFloatColumnSelector selector, Aggregator agg) + { + agg.aggregate(); + selector.increment(); + } + + private JavaScriptAggregator jsAggregator; + private DoubleSumAggregator doubleAgg; + final LoopingFloatColumnSelector selector = new LoopingFloatColumnSelector(new float[]{42.12f, 9f}); + + @Override + protected void setUp() throws Exception + { + Map script = scriptDoubleSum; + + jsAggregator = new JavaScriptAggregator( + "billy", + Lists.asList(MetricSelectorUtils.wrap(selector), new ObjectColumnSelector[]{}), + JavaScriptAggregatorFactory.compileScript( + script.get("fnAggregate"), + script.get("fnReset"), + script.get("fnCombine") + ) + ); + + doubleAgg = new DoubleSumAggregator("billy", selector); + } + + public double timeJavaScriptDoubleSum(int reps) + { + double val = 0; + for(int i = 0; i < reps; ++i) { + aggregate(selector, jsAggregator); + } + return val; + } + + public double timeNativeDoubleSum(int reps) + { + double val = 0; + for(int i = 0; i < reps; ++i) { + aggregate(selector, doubleAgg); + } + return val; + } + + public static void main(String[] args) throws Exception + { + Runner.main(JavaScriptAggregatorBenchmark.class, args); + } + + protected static class LoopingFloatColumnSelector extends TestFloatColumnSelector + { + private final float[] floats; + private long index = 0; + + public LoopingFloatColumnSelector(float[] floats) + { + super(floats); + this.floats = floats; + } + + @Override + public float get() + { + return floats[(int) (index % floats.length)]; + } + + public void increment() + { + ++index; + if (index < 0) { + index = 0; + } + } + } +} diff --git a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java index d53ea6d123..c509d8ba92 100644 --- a/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java +++ b/processing/src/test/java/io/druid/query/aggregation/JavaScriptAggregatorTest.java @@ -223,7 +223,7 @@ public class JavaScriptAggregatorTest } public static void main(String... args) throws Exception { - final LoopingFloatColumnSelector selector = new LoopingFloatColumnSelector(new float[]{42.12f, 9f}); + final JavaScriptAggregatorBenchmark.LoopingFloatColumnSelector selector = new JavaScriptAggregatorBenchmark.LoopingFloatColumnSelector(new float[]{42.12f, 9f}); /* memory usage test List aggs = Lists.newLinkedList(); @@ -286,30 +286,4 @@ public class JavaScriptAggregatorTest System.out.println(String.format("JavaScript is %2.1fx slower", (double)t1 / t2)); } - - static class LoopingFloatColumnSelector extends TestFloatColumnSelector - { - private final float[] floats; - private long index = 0; - - public LoopingFloatColumnSelector(float[] floats) - { - super(floats); - this.floats = floats; - } - - @Override - public float get() - { - return floats[(int)(index % floats.length)]; - } - - public void increment() - { - ++index; - if (index < 0) { - index = 0; - } - } - } } -- GitLab