mirror of https://github.com/apache/druid.git
reduce bytearray copy to minimal optimize VSizeIndexedWriter
This commit is contained in:
parent
a2d0bea223
commit
0eafbd55b2
|
@ -50,11 +50,31 @@ public class VSizeIndexedInts implements IndexedInts, Comparable<VSizeIndexedInt
|
|||
return fromList(Lists.<Integer>newArrayList(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* provide for performance reason.
|
||||
*/
|
||||
public static byte[] getBytesNoPaddingfromList(List<Integer> list, int maxValue)
|
||||
{
|
||||
int numBytes = getNumBytesForMax(maxValue);
|
||||
|
||||
final ByteBuffer buffer = ByteBuffer.allocate((list.size() * numBytes));
|
||||
writeToBuffer(buffer, list, numBytes, maxValue);
|
||||
|
||||
return buffer.array();
|
||||
}
|
||||
|
||||
public static VSizeIndexedInts fromList(List<Integer> list, int maxValue)
|
||||
{
|
||||
int numBytes = getNumBytesForMax(maxValue);
|
||||
|
||||
final ByteBuffer buffer = ByteBuffer.allocate((list.size() * numBytes) + (4 - numBytes));
|
||||
writeToBuffer(buffer, list, numBytes, maxValue);
|
||||
|
||||
return new VSizeIndexedInts(buffer.asReadOnlyBuffer(), numBytes);
|
||||
}
|
||||
|
||||
private static void writeToBuffer(ByteBuffer buffer, List<Integer> list, int numBytes, int maxValue)
|
||||
{
|
||||
int i = 0;
|
||||
for (Integer val : list) {
|
||||
if (val < 0) {
|
||||
|
@ -69,8 +89,6 @@ public class VSizeIndexedInts implements IndexedInts, Comparable<VSizeIndexedInt
|
|||
++i;
|
||||
}
|
||||
buffer.position(0);
|
||||
|
||||
return new VSizeIndexedInts(buffer.asReadOnlyBuffer(), numBytes);
|
||||
}
|
||||
|
||||
public static byte getNumBytesForMax(int maxValue)
|
||||
|
|
|
@ -70,7 +70,7 @@ public class VSizeIndexedWriter implements Closeable
|
|||
|
||||
public void write(List<Integer> ints) throws IOException
|
||||
{
|
||||
byte[] bytesToWrite = ints == null ? EMPTY_ARRAY : VSizeIndexedInts.fromList(ints, maxId).getBytesNoPadding();
|
||||
byte[] bytesToWrite = ints == null ? EMPTY_ARRAY : VSizeIndexedInts.getBytesNoPaddingfromList(ints, maxId);
|
||||
|
||||
valuesOut.write(bytesToWrite);
|
||||
|
||||
|
|
|
@ -22,9 +22,12 @@ package io.druid.segment.data;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.common.primitives.Ints;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*/
|
||||
|
@ -63,4 +66,15 @@ public class VSizeIndexedIntsTest
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetBytesNoPaddingfromList() throws Exception
|
||||
{
|
||||
final int[] array = {1, 2, 4, 5, 6, 8, 9, 10};
|
||||
List<Integer> list = Ints.asList(array);
|
||||
int maxValue = Ints.max(array);
|
||||
VSizeIndexedInts ints = VSizeIndexedInts.fromList(list, maxValue);
|
||||
byte[] bytes1 = ints.getBytesNoPadding();
|
||||
byte[] bytes2 = VSizeIndexedInts.getBytesNoPaddingfromList(list, maxValue);
|
||||
Assert.assertArrayEquals(bytes1, bytes2);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue