summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-07-25 22:54:14 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-07-31 17:04:17 +0200
commitc43f771f6e43c73cc34010f0b105bef1907f0326 (patch)
treebd690e13ea78a8838eef2e385a2f2b48b055ab35 /document
parent5d556da6996ba3fd81d6bfb8a48ef25428978eee (diff)
Avoid copy by stealing allocation, and by presizing buffer.
Diffstat (limited to 'document')
-rw-r--r--document/src/tests/serialization/vespadocumentserializer_test.cpp7
-rw-r--r--document/src/vespa/document/fieldvalue/fieldvalue.cpp9
-rw-r--r--document/src/vespa/document/fieldvalue/structfieldvalue.h3
-rw-r--r--document/src/vespa/document/serialization/vespadocumentserializer.cpp2
4 files changed, 13 insertions, 8 deletions
diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp
index 174e49798bf..45920cb10fd 100644
--- a/document/src/tests/serialization/vespadocumentserializer_test.cpp
+++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp
@@ -519,15 +519,16 @@ TEST("requireThatUncompressedStructFieldValueCanBeSerialized") {
TEST("requireThatCompressedStructFieldValueCanBeSerialized") {
StructDataType structType(getStructDataType());
StructFieldValue value = getStructFieldValue(structType);
- const_cast<StructDataType &>(value.getStructType()).setCompressionConfig(CompressionConfig(CompressionConfig::LZ4, 0, 95));
+ const_cast<StructDataType *>(static_cast<const StructDataType *>(value.getDataType()))
+ ->setCompressionConfig(CompressionConfig(CompressionConfig::LZ4, 0, 95));
checkStructSerialization(value, CompressionConfig::LZ4);
}
TEST("requireThatReserializationPreservesCompressionIfUnmodified") {
StructDataType structType(getStructDataType());
StructFieldValue value = getStructFieldValue(structType);
- const_cast<StructDataType &>(value.getStructType()).
- setCompressionConfig(CompressionConfig(CompressionConfig::LZ4, 0, 95));
+ const_cast<StructDataType *>(static_cast<const StructDataType *>(value.getDataType()))
+ ->setCompressionConfig(CompressionConfig(CompressionConfig::LZ4, 0, 95));
TEST_DO(checkStructSerialization(value, CompressionConfig::LZ4));
diff --git a/document/src/vespa/document/fieldvalue/fieldvalue.cpp b/document/src/vespa/document/fieldvalue/fieldvalue.cpp
index 1d6f39318c3..d3109160248 100644
--- a/document/src/vespa/document/fieldvalue/fieldvalue.cpp
+++ b/document/src/vespa/document/fieldvalue/fieldvalue.cpp
@@ -43,9 +43,12 @@ std::unique_ptr<ByteBuffer> FieldValue::serialize() const {
nbostream stream;
serialize(stream);
- std::unique_ptr<ByteBuffer> retVal(new ByteBuffer(stream.size()));
- retVal->putBytes(stream.peek(), stream.size());
- return retVal;
+ nbostream::Buffer buf;
+ stream.swap(buf);
+ size_t sz = buf.size();
+ auto bb = std::make_unique<ByteBuffer>(nbostream::Buffer::stealAlloc(std::move(buf)), sz);
+ bb->setPos(sz);
+ return bb;
}
size_t
diff --git a/document/src/vespa/document/fieldvalue/structfieldvalue.h b/document/src/vespa/document/fieldvalue/structfieldvalue.h
index 358797bfae6..6ab6f71ce56 100644
--- a/document/src/vespa/document/fieldvalue/structfieldvalue.h
+++ b/document/src/vespa/document/fieldvalue/structfieldvalue.h
@@ -61,8 +61,6 @@ public:
const DocumentTypeRepo * getRepo() const { return _repo; }
void setDocumentType(const DocumentType & docType) { _doc_type = & docType; }
- const StructDataType & getStructType() const;
-
void lazyDeserialize(const FixedTypeRepo &repo,
uint16_t version,
SerializableArray::EntryMap && fields,
@@ -120,6 +118,7 @@ private:
bool hasFieldValue(const Field&) const override;
void removeFieldValue(const Field&) override;
VESPA_DLL_LOCAL vespalib::ConstBufferRef getRawField(uint32_t id) const;
+ VESPA_DLL_LOCAL const StructDataType & getStructType() const;
// Iterator implementation
class FieldIterator;
diff --git a/document/src/vespa/document/serialization/vespadocumentserializer.cpp b/document/src/vespa/document/serialization/vespadocumentserializer.cpp
index 0c0841bf85e..9e39c16eec3 100644
--- a/document/src/vespa/document/serialization/vespadocumentserializer.cpp
+++ b/document/src/vespa/document/serialization/vespadocumentserializer.cpp
@@ -344,6 +344,8 @@ void VespaDocumentSerializer::writeUnchanged(const SerializableArray &value) {
const ByteBuffer* buffer = value.getSerializedBuffer();
uint32_t sz = (buffer != NULL) ? buffer->getLength() : 0;
+ size_t estimatedRequiredSpace = sz + 4 + 1 + 8 + 4 + field_info.size()*12;
+ _stream.reserve(_stream.size() + estimatedRequiredSpace);
_stream << sz;
_stream << static_cast<uint8_t>(value.getCompression());
if (CompressionConfig::isCompressed(value.getCompression())) {