mirror of https://github.com/apache/druid.git
Merge pull request #866 from metamx/mutableBitmapBenchmark
Add benchmarking for bitmaps
This commit is contained in:
commit
6ee8029462
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* Druid - a distributed column store.
|
||||
* Copyright (C) 2012, 2013 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.segment.data;
|
||||
|
||||
import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
|
||||
import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.metamx.collections.bitmap.BitmapFactory;
|
||||
import com.metamx.collections.bitmap.ImmutableBitmap;
|
||||
import com.metamx.collections.bitmap.MutableBitmap;
|
||||
import com.metamx.common.logger.Logger;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@RunWith(Parameterized.class)
|
||||
public class BitmapCreationBenchmark extends AbstractBenchmark
|
||||
{
|
||||
private static final Logger log = new Logger(BitmapCreationBenchmark.class);
|
||||
|
||||
@Parameterized.Parameters
|
||||
public static List<Class<? extends BitmapSerdeFactory>[]> factoryClasses()
|
||||
{
|
||||
return Arrays.<Class<? extends BitmapSerdeFactory>[]>asList(
|
||||
(Class<? extends BitmapSerdeFactory>[]) Arrays.<Class<? extends BitmapSerdeFactory>>asList(
|
||||
ConciseBitmapSerdeFactory.class
|
||||
).toArray(),
|
||||
(Class<? extends BitmapSerdeFactory>[]) Arrays.<Class<? extends BitmapSerdeFactory>>asList(
|
||||
RoaringBitmapSerdeFactory.class
|
||||
).toArray()
|
||||
);
|
||||
}
|
||||
|
||||
final BitmapFactory factory;
|
||||
final ObjectStrategy<ImmutableBitmap> objectStrategy;
|
||||
|
||||
public BitmapCreationBenchmark(Class<? extends BitmapSerdeFactory> clazz)
|
||||
throws IllegalAccessException, InstantiationException
|
||||
{
|
||||
BitmapSerdeFactory serdeFactory = clazz.newInstance();
|
||||
factory = serdeFactory.getBitmapFactory();
|
||||
objectStrategy = serdeFactory.getObjectStrategy();
|
||||
}
|
||||
|
||||
private static final int numBits = 100000;
|
||||
|
||||
|
||||
static Random random;
|
||||
static int[] randIndex = new int[numBits];
|
||||
|
||||
@AfterClass
|
||||
public static void cleanupAfterClass()
|
||||
{
|
||||
List<Class<? extends BitmapSerdeFactory>[]> classes = factoryClasses();
|
||||
for (int i = 0; i < classes.size(); ++i) {
|
||||
log.info("Entry [%d] is %s", i, classes.get(i)[0].getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void setupBeforeClass()
|
||||
{
|
||||
for (int i = 0; i < numBits; ++i) {
|
||||
randIndex[i] = i;
|
||||
}
|
||||
// Random seed chosen by hitting keyboard with BOTH hands... multiple times!
|
||||
random = new Random(78591378);
|
||||
for (int i = 0; i < numBits; ++i) {
|
||||
int idex = random.nextInt(randIndex.length);
|
||||
int swap = randIndex[i];
|
||||
randIndex[i] = randIndex[idex];
|
||||
randIndex[idex] = swap;
|
||||
}
|
||||
}
|
||||
|
||||
ImmutableBitmap baseImmutableBitmap;
|
||||
MutableBitmap baseMutableBitmap;
|
||||
byte[] baseBytes;
|
||||
ByteBuffer baseByteBuffer;
|
||||
|
||||
@Before
|
||||
public void setup()
|
||||
{
|
||||
baseMutableBitmap = factory.makeEmptyMutableBitmap();
|
||||
for (int i = 0; i < numBits; ++i) {
|
||||
baseMutableBitmap.add(i);
|
||||
}
|
||||
baseImmutableBitmap = factory.makeImmutableBitmap(baseMutableBitmap);
|
||||
baseBytes = baseImmutableBitmap.toBytes();
|
||||
baseByteBuffer = ByteBuffer.wrap(baseBytes);
|
||||
}
|
||||
|
||||
|
||||
@BenchmarkOptions(warmupRounds = 10, benchmarkRounds = 1000)
|
||||
@Test
|
||||
public void testLinearAddition()
|
||||
{
|
||||
MutableBitmap mutableBitmap = factory.makeEmptyMutableBitmap();
|
||||
for (int i = 0; i < numBits; ++i) {
|
||||
mutableBitmap.add(i);
|
||||
}
|
||||
Assert.assertEquals(numBits, mutableBitmap.size());
|
||||
}
|
||||
|
||||
@BenchmarkOptions(warmupRounds = 10, benchmarkRounds = 10)
|
||||
@Test
|
||||
public void testRandomAddition()
|
||||
{
|
||||
MutableBitmap mutableBitmap = factory.makeEmptyMutableBitmap();
|
||||
for (int i : randIndex) {
|
||||
mutableBitmap.add(i);
|
||||
}
|
||||
Assert.assertEquals(numBits, mutableBitmap.size());
|
||||
}
|
||||
|
||||
@BenchmarkOptions(warmupRounds = 10, benchmarkRounds = 1000)
|
||||
@Test
|
||||
public void testLinearAdditionDescending()
|
||||
{
|
||||
MutableBitmap mutableBitmap = factory.makeEmptyMutableBitmap();
|
||||
for (int i = numBits - 1; i >= 0; --i) {
|
||||
mutableBitmap.add(i);
|
||||
}
|
||||
Assert.assertEquals(numBits, mutableBitmap.size());
|
||||
}
|
||||
|
||||
|
||||
@BenchmarkOptions(warmupRounds = 10, benchmarkRounds = 1000)
|
||||
@Test
|
||||
public void testToImmutableByteArray()
|
||||
{
|
||||
ImmutableBitmap immutableBitmap = factory.makeImmutableBitmap(baseMutableBitmap);
|
||||
Assert.assertArrayEquals(baseBytes, immutableBitmap.toBytes());
|
||||
}
|
||||
|
||||
|
||||
@BenchmarkOptions(warmupRounds = 10, benchmarkRounds = 1000)
|
||||
@Test
|
||||
public void testFromImmutableByteArray()
|
||||
{
|
||||
ImmutableBitmap immutableBitmap = factory.mapImmutableBitmap(baseByteBuffer);
|
||||
Assert.assertEquals(numBits, immutableBitmap.size());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue