In serializers which use elastic Bytes, inherit Bytes' capacity on copy() to avoid unnecessary resizes in each copy

This commit is contained in:
leventov
2016-11-20 19:36:00 -06:00
parent a26b19d5c7
commit 852e503607
11 changed files with 104 additions and 33 deletions
@@ -27,6 +27,8 @@ import net.openhft.chronicle.wire.WireIn;
import net.openhft.chronicle.wire.WireOut;
import org.jetbrains.annotations.NotNull;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
abstract class AbstractCharSequenceUtf8DataAccess<T extends CharSequence> extends AbstractData<T>
implements DataAccess<T>, Data<T> {
@@ -36,12 +38,12 @@ abstract class AbstractCharSequenceUtf8DataAccess<T extends CharSequence> extend
/** State field */
transient T cs;
AbstractCharSequenceUtf8DataAccess() {
initTransients();
AbstractCharSequenceUtf8DataAccess(long bytesCapacity) {
initTransients(bytesCapacity);
}
private void initTransients() {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes();
private void initTransients(long bytesCapacity) {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity);
}
@Override
@@ -60,7 +62,7 @@ abstract class AbstractCharSequenceUtf8DataAccess<T extends CharSequence> extend
@Override
public void readMarshallable(@NotNull WireIn wireIn) {
// no config fields to read
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
@Override
@@ -24,6 +24,8 @@ import net.openhft.chronicle.wire.WireIn;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public class BytesMarshallableDataAccess<T extends BytesMarshallable>
extends InstanceCreatingMarshaller<T> implements DataAccess<T>, Data<T> {
@@ -36,18 +38,22 @@ public class BytesMarshallableDataAccess<T extends BytesMarshallable>
private transient T instance;
public BytesMarshallableDataAccess(Class<T> tClass) {
this(tClass, DEFAULT_BYTES_CAPACITY);
}
private BytesMarshallableDataAccess(Class<T> tClass, long bytesCapacity) {
super(tClass);
initTransients();
initTransients(bytesCapacity);
}
@Override
public void readMarshallable(@NotNull WireIn wireIn) {
super.readMarshallable(wireIn);
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
private void initTransients() {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes();
private void initTransients(long bytesCapacity) {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity);
targetBytes = VanillaBytes.vanillaBytes();
}
@@ -133,6 +139,6 @@ public class BytesMarshallableDataAccess<T extends BytesMarshallable>
@Override
public DataAccess<T> copy() {
return new BytesMarshallableDataAccess<>(tClass());
return new BytesMarshallableDataAccess<>(tClass(), bytes.realCapacity());
}
}
@@ -23,7 +23,10 @@ import net.openhft.chronicle.hash.serialization.SizedWriter;
import org.jetbrains.annotations.NotNull;
/**
* @deprecated use one of {@link AbstractCharSequenceUtf8DataAccess} subclasses instead
* @deprecated use one of {@link AbstractCharSequenceUtf8DataAccess} subclasses instead. This class
* is not removed, because users who created a chronicleMap with older version of the library with
* this class as the key or value writer should be able to read and access the map with the present
* version of the library.
*/
@Deprecated
@SuppressWarnings("deprecation")
@@ -23,6 +23,14 @@ import org.jetbrains.annotations.Nullable;
public final class CharSequenceUtf8DataAccess
extends AbstractCharSequenceUtf8DataAccess<CharSequence> {
public CharSequenceUtf8DataAccess() {
this(DefaultElasticBytes.DEFAULT_BYTES_CAPACITY);
}
private CharSequenceUtf8DataAccess(long bytesCapacity) {
super(bytesCapacity);
}
@Override
public CharSequence getUsing(@Nullable CharSequence using) {
StringBuilder sb;
@@ -38,6 +46,6 @@ public final class CharSequenceUtf8DataAccess
@Override
public DataAccess<CharSequence> copy() {
return new CharSequenceUtf8DataAccess();
return new CharSequenceUtf8DataAccess(bytes().realCapacity());
}
}
@@ -21,8 +21,14 @@ import net.openhft.chronicle.bytes.Bytes;
final class DefaultElasticBytes {
public static Bytes<?> allocateDefaultElasticBytes() {
return Bytes.elasticHeapByteBuffer(32);
static final int DEFAULT_BYTES_CAPACITY = 32;
static Bytes<?> allocateDefaultElasticBytes(long bytesCapacity) {
if (bytesCapacity <= Bytes.MAX_BYTE_BUFFER_CAPACITY) {
return Bytes.elasticHeapByteBuffer((int) bytesCapacity);
} else {
return Bytes.allocateElasticDirect(bytesCapacity);
}
}
private DefaultElasticBytes() {}
@@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.openhft.chronicle.hash.serialization.StatefulCopyable.copyIfNeeded;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public class ExternalBytesMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T>
implements DataAccess<T>, Data<T> {
@@ -45,14 +46,20 @@ public class ExternalBytesMarshallableDataAccess<T> extends InstanceCreatingMars
public ExternalBytesMarshallableDataAccess(
Class<T> tClass, SizedReader<T> reader, BytesWriter<? super T> writer) {
this(tClass, reader, writer, DEFAULT_BYTES_CAPACITY);
}
private ExternalBytesMarshallableDataAccess(
Class<T> tClass, SizedReader<T> reader, BytesWriter<? super T> writer,
long bytesCapacity) {
super(tClass);
this.writer = writer;
this.reader = reader;
initTransients();
initTransients(bytesCapacity);
}
private void initTransients() {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes();
private void initTransients(long bytesCapacity) {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity);
}
@Override
@@ -115,7 +122,7 @@ public class ExternalBytesMarshallableDataAccess<T> extends InstanceCreatingMars
@Override
public DataAccess<T> copy() {
return new ExternalBytesMarshallableDataAccess<>(
tClass(), copyIfNeeded(reader), copyIfNeeded(writer));
tClass(), copyIfNeeded(reader), copyIfNeeded(writer), bytes.realCapacity());
}
@Override
@@ -123,7 +130,7 @@ public class ExternalBytesMarshallableDataAccess<T> extends InstanceCreatingMars
super.readMarshallable(wireIn);
reader = wireIn.read(() -> "reader").typedMarshallable();
writer = wireIn.read(() -> "writer").typedMarshallable();
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
@Override
@@ -29,12 +29,19 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public class ExternalizableDataAccess<T extends Externalizable> extends SerializableDataAccess<T> {
/** Config field */
private Class<T> tClass;
public ExternalizableDataAccess(Class<T> tClass) {
this(tClass, DEFAULT_BYTES_CAPACITY);
}
private ExternalizableDataAccess(Class<T> tClass, long bytesCapacity) {
super(bytesCapacity);
this.tClass = tClass;
}
@@ -80,13 +87,13 @@ public class ExternalizableDataAccess<T extends Externalizable> extends Serializ
@Override
public DataAccess<T> copy() {
return new ExternalizableDataAccess<>(tClass);
return new ExternalizableDataAccess<>(tClass, bytes.realCapacity());
}
@Override
public void readMarshallable(@NotNull WireIn wireIn) {
tClass = wireIn.read(() -> "tClass").typeLiteral();
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
@Override
@@ -29,6 +29,8 @@ import org.jetbrains.annotations.Nullable;
import java.io.*;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public class SerializableDataAccess<T extends Serializable> extends AbstractData<T>
implements DataAccess<T> {
@@ -41,11 +43,15 @@ public class SerializableDataAccess<T extends Serializable> extends AbstractData
transient T instance;
public SerializableDataAccess() {
initTransients();
this(DEFAULT_BYTES_CAPACITY);
}
void initTransients() {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes();
SerializableDataAccess(long bytesCapacity) {
initTransients(bytesCapacity);
}
void initTransients(long bytesCapacity) {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity);
out = bytes.outputStream();
in = bytes.inputStream();
}
@@ -103,13 +109,13 @@ public class SerializableDataAccess<T extends Serializable> extends AbstractData
@Override
public DataAccess<T> copy() {
return new SerializableDataAccess<>();
return new SerializableDataAccess<>(bytes.realCapacity());
}
@Override
public void readMarshallable(@NotNull WireIn wireIn) {
// no fields to read
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
@Override
@@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.openhft.chronicle.hash.serialization.StatefulCopyable.copyIfNeeded;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public class SizedMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T>
implements DataAccess<T>, Data<T> {
@@ -47,10 +48,16 @@ public class SizedMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T
public SizedMarshallableDataAccess(
Class<T> tClass, SizedReader<T> sizedReader, SizedWriter<? super T> sizedWriter) {
this(tClass, sizedReader, sizedWriter, DEFAULT_BYTES_CAPACITY);
}
private SizedMarshallableDataAccess(
Class<T> tClass, SizedReader<T> sizedReader, SizedWriter<? super T> sizedWriter,
long bytesCapacity) {
super(tClass);
this.sizedWriter = sizedWriter;
this.sizedReader = sizedReader;
initTransients();
initTransients(bytesCapacity);
}
SizedReader<T> sizedReader() {
@@ -61,8 +68,8 @@ public class SizedMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T
return sizedWriter;
}
private void initTransients() {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes();
private void initTransients(long bytesCapacity) {
bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity);
targetBytes = VanillaBytes.vanillaBytes();
}
@@ -143,7 +150,8 @@ public class SizedMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T
@Override
public DataAccess<T> copy() {
return new SizedMarshallableDataAccess<>(
tClass(), copyIfNeeded(sizedReader), copyIfNeeded(sizedWriter));
tClass(), copyIfNeeded(sizedReader), copyIfNeeded(sizedWriter),
bytes.realCapacity());
}
@Override
@@ -151,7 +159,7 @@ public class SizedMarshallableDataAccess<T> extends InstanceCreatingMarshaller<T
super.readMarshallable(wireIn);
sizedReader = wireIn.read(() -> "sizedReader").typedMarshallable();
sizedWriter = wireIn.read(() -> "sizedWriter").typedMarshallable();
initTransients();
initTransients(DEFAULT_BYTES_CAPACITY);
}
@Override
@@ -20,9 +20,19 @@ package net.openhft.chronicle.hash.serialization.impl;
import net.openhft.chronicle.hash.serialization.DataAccess;
import org.jetbrains.annotations.Nullable;
import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY;
public final class StringBuilderUtf8DataAccess
extends AbstractCharSequenceUtf8DataAccess<StringBuilder> {
public StringBuilderUtf8DataAccess() {
this(DEFAULT_BYTES_CAPACITY);
}
private StringBuilderUtf8DataAccess(long bytesCapacity) {
super(bytesCapacity);
}
@Override
public StringBuilder getUsing(@Nullable StringBuilder using) {
if (using != null) {
@@ -36,6 +46,6 @@ public final class StringBuilderUtf8DataAccess
@Override
public DataAccess<StringBuilder> copy() {
return new StringBuilderUtf8DataAccess();
return new StringBuilderUtf8DataAccess(bytes().realCapacity());
}
}
@@ -22,6 +22,14 @@ import org.jetbrains.annotations.Nullable;
public final class StringUtf8DataAccess extends AbstractCharSequenceUtf8DataAccess<String> {
public StringUtf8DataAccess() {
this(DefaultElasticBytes.DEFAULT_BYTES_CAPACITY);
}
private StringUtf8DataAccess(long bytesCapacity) {
super(bytesCapacity);
}
@Override
public String getUsing(@Nullable String using) {
return cs;
@@ -29,6 +37,6 @@ public final class StringUtf8DataAccess extends AbstractCharSequenceUtf8DataAcce
@Override
public DataAccess<String> copy() {
return new StringUtf8DataAccess();
return new StringUtf8DataAccess(bytes().realCapacity());
}
}