mirror of
https://github.com/OpenHFT/Chronicle-Map.git
synced 2021-09-13 01:26:12 +00:00
In serializers which use elastic Bytes, inherit Bytes' capacity on copy() to avoid unnecessary resizes in each copy
This commit is contained in:
+7
-5
@@ -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
|
||||
|
||||
+11
-5
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -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")
|
||||
|
||||
+9
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+8
-2
@@ -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() {}
|
||||
|
||||
+12
-5
@@ -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
|
||||
|
||||
+9
-2
@@ -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
|
||||
|
||||
+11
-5
@@ -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
|
||||
|
||||
+13
-5
@@ -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
|
||||
|
||||
+11
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+9
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user