diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-25 22:54:14 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-31 17:04:17 +0200 |
commit | c43f771f6e43c73cc34010f0b105bef1907f0326 (patch) | |
tree | bd690e13ea78a8838eef2e385a2f2b48b055ab35 /document | |
parent | 5d556da6996ba3fd81d6bfb8a48ef25428978eee (diff) |
Avoid copy by stealing allocation, and by presizing buffer.
Diffstat (limited to 'document')
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())) { |