diff options
| author | Dan Engelbrecht <[email protected]> | 2024-05-30 14:44:34 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-05-30 14:44:34 +0200 |
| commit | 8ce1dc72cce381b2adae256504331f2e8893f262 (patch) | |
| tree | df5ab56ce8cdf0f6664ed611f4cf1fb848718ea6 /src/zenutil/packageformat.cpp | |
| parent | workspaces review feedback (diff) | |
| download | zen-8ce1dc72cce381b2adae256504331f2e8893f262.tar.xz zen-8ce1dc72cce381b2adae256504331f2e8893f262.zip | |
cache optimizations (#88)
* message formatting optimizations
* bump iostorecompression small value threshold to 1MB
Diffstat (limited to 'src/zenutil/packageformat.cpp')
| -rw-r--r-- | src/zenutil/packageformat.cpp | 62 |
1 files changed, 27 insertions, 35 deletions
diff --git a/src/zenutil/packageformat.cpp b/src/zenutil/packageformat.cpp index 963a442cd..8087b7564 100644 --- a/src/zenutil/packageformat.cpp +++ b/src/zenutil/packageformat.cpp @@ -45,17 +45,7 @@ FormatPackageMessageBuffer(const CbPackage& Data, void* TargetProcessHandle) CompositeBuffer FormatPackageMessageBuffer(const CbPackage& Data, FormatFlags Flags, void* TargetProcessHandle) { - std::vector<IoBuffer> Message = FormatPackageMessage(Data, Flags, TargetProcessHandle); - - std::vector<SharedBuffer> Buffers; - - for (IoBuffer& Buf : Message) - { - ZEN_ASSERT(Buf.GetSize() > 0); - Buffers.push_back(SharedBuffer(Buf)); - } - - return CompositeBuffer(std::move(Buffers)); + return CompositeBuffer(FormatPackageMessage(Data, Flags, TargetProcessHandle)); } static void @@ -76,7 +66,7 @@ MarshalLocal(CbAttachmentEntry*& AttachmentInfo, .Flags = (IsCompressed ? uint32_t(CbAttachmentEntry::kIsCompressed) : 0u) | CbAttachmentEntry::kIsLocalRef, .AttachmentHash = AttachmentHash}; - ResponseBuffers.push_back(std::move(RefBuffer)); + ResponseBuffers.emplace_back(std::move(RefBuffer)); }; static bool @@ -182,29 +172,27 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce const std::span<const CbAttachment>& Attachments = Data.GetAttachments(); std::vector<IoBuffer> ResponseBuffers; - ResponseBuffers.reserve(3 + Attachments.size()); // TODO: may want to use an additional fudge factor here to avoid growing since each + ResponseBuffers.reserve(2 + Attachments.size()); // TODO: may want to use an additional fudge factor here to avoid growing since each // attachment is likely to consist of several buffers + IoBuffer AttachmentMetadataBuffer = IoBuffer{sizeof(CbPackageHeader) + sizeof(CbAttachmentEntry) * (Attachments.size() + /* root */ 1)}; + MutableMemoryView HeaderView = AttachmentMetadataBuffer.GetMutableView(); // Fixed size header - CbPackageHeader Hdr{.HeaderMagic = kCbPkgMagic, .AttachmentCount = gsl::narrow<uint32_t>(Attachments.size())}; - - ResponseBuffers.push_back(IoBufferBuilder::MakeCloneFromMemory(&Hdr, sizeof Hdr)); + CbPackageHeader* Hdr = (CbPackageHeader*)HeaderView.GetData(); + *Hdr = {.HeaderMagic = kCbPkgMagic, .AttachmentCount = gsl::narrow<uint32_t>(Attachments.size())}; + HeaderView.MidInline(sizeof(CbPackageHeader)); // Attachment metadata array - - IoBuffer AttachmentMetadataBuffer = IoBuffer{sizeof(CbAttachmentEntry) * (Attachments.size() + /* root */ 1)}; - CbAttachmentEntry* AttachmentInfo = reinterpret_cast<CbAttachmentEntry*>(AttachmentMetadataBuffer.MutableData()); - - ResponseBuffers.push_back(AttachmentMetadataBuffer); // Attachment metadata + CbAttachmentEntry* AttachmentInfo = reinterpret_cast<CbAttachmentEntry*>(HeaderView.GetData()); + ResponseBuffers.emplace_back(std::move(AttachmentMetadataBuffer)); // Attachment metadata // Root object IoBuffer RootIoBuffer = Data.GetObject().GetBuffer().AsIoBuffer(); ZEN_ASSERT(RootIoBuffer.GetSize() > 0); - ResponseBuffers.push_back(RootIoBuffer); // Root object - *AttachmentInfo++ = {.PayloadSize = RootIoBuffer.Size(), .Flags = CbAttachmentEntry::kIsObject, .AttachmentHash = Data.GetObjectHash()}; + ResponseBuffers.emplace_back(std::move(RootIoBuffer)); // Root object // Attachment payloads tsl::robin_map<void*, std::string> FileNameMap; @@ -215,10 +203,10 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce { ZEN_NOT_IMPLEMENTED("Null attachments are not supported"); } - else if (CompressedBuffer AttachmentBuffer = Attachment.AsCompressedBinary()) + else if (const CompressedBuffer& AttachmentBuffer = Attachment.AsCompressedBinary()) { - CompositeBuffer Compressed = AttachmentBuffer.GetCompressed(); - IoHash AttachmentHash = Attachment.GetHash(); + const CompositeBuffer& Compressed = AttachmentBuffer.GetCompressed(); + IoHash AttachmentHash = Attachment.GetHash(); // If the data is either not backed by a file, or there are multiple // fragments then we cannot marshal it by local reference. We might @@ -257,10 +245,12 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce .Flags = CbAttachmentEntry::kIsCompressed, .AttachmentHash = AttachmentHash}; - for (const SharedBuffer& Segment : Compressed.GetSegments()) + std::span<const SharedBuffer> Segments = Compressed.GetSegments(); + ResponseBuffers.reserve(ResponseBuffers.size() + Segments.size() - 1); + for (const SharedBuffer& Segment : Segments) { ZEN_ASSERT(Segment.GetSize() > 0); - ResponseBuffers.push_back(Segment.AsIoBuffer()); + ResponseBuffers.emplace_back(Segment.AsIoBuffer()); } } } @@ -268,13 +258,13 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce { IoBuffer ObjIoBuffer = AttachmentObject.GetBuffer().AsIoBuffer(); ZEN_ASSERT(ObjIoBuffer.GetSize() > 0); - ResponseBuffers.push_back(ObjIoBuffer); + ResponseBuffers.emplace_back(std::move(ObjIoBuffer)); *AttachmentInfo++ = {.PayloadSize = ObjIoBuffer.Size(), .Flags = CbAttachmentEntry::kIsObject, .AttachmentHash = Attachment.GetHash()}; } - else if (CompositeBuffer AttachmentBinary = Attachment.AsCompositeBinary()) + else if (const CompositeBuffer& AttachmentBinary = Attachment.AsCompositeBinary()) { IoHash AttachmentHash = Attachment.GetHash(); bool MarshalByLocalRef = @@ -309,10 +299,12 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce { *AttachmentInfo++ = {.PayloadSize = AttachmentBinary.GetSize(), .Flags = 0, .AttachmentHash = Attachment.GetHash()}; - for (const SharedBuffer& Segment : AttachmentBinary.GetSegments()) + std::span<const SharedBuffer> Segments = AttachmentBinary.GetSegments(); + ResponseBuffers.reserve(ResponseBuffers.size() + Segments.size() - 1); + for (const SharedBuffer& Segment : Segments) { ZEN_ASSERT(Segment.GetSize() > 0); - ResponseBuffers.push_back(Segment.AsIoBuffer()); + ResponseBuffers.emplace_back(Segment.AsIoBuffer()); } } } @@ -640,7 +632,7 @@ CbPackageReader::ProcessPackageHeaderData(const void* Data, uint64_t DataBytes) // the caller will need to handle the payload differently (i.e it's a // CbAttachmentReferenceHeader not the actual payload) - m_PayloadBuffers.push_back(IoBuffer{Entry.PayloadSize}); + m_PayloadBuffers.emplace_back(IoBuffer{Entry.PayloadSize}); } m_CurrentState = State::kReadingBuffers; @@ -738,14 +730,14 @@ CbPackageReader::Finalize() CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(ChunkReference), RawHash, RawSize); if (RawHash == Entry.AttachmentHash) { - m_Attachments.push_back(CbAttachment(Compressed, Entry.AttachmentHash)); + m_Attachments.emplace_back(CbAttachment(Compressed, Entry.AttachmentHash)); } } else { CompressedBuffer Compressed = CompressedBuffer::Compress(SharedBuffer(ChunkReference), OodleCompressor::NotSet, OodleCompressionLevel::None); - m_Attachments.push_back(CbAttachment(std::move(Compressed), Compressed.DecodeRawHash())); + m_Attachments.emplace_back(CbAttachment(std::move(Compressed), Compressed.DecodeRawHash())); } } |