From c00d5fb305abff370f869dec0e9404f8a4a5646b Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 7 Apr 2015 12:50:07 +0200 Subject: Use memcpy to copy tables into vectors. Ideally we wouldn't be copying at all, and somehow cast the table to a vector. Unfortunately I haven't figured out how to do that, and this solution at least gets us from 0.065 ms to 0.028 ms in testCreateCommand. --- common/entitybuffer.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'common/entitybuffer.cpp') diff --git a/common/entitybuffer.cpp b/common/entitybuffer.cpp index 5ba4afe..b555ac3 100644 --- a/common/entitybuffer.cpp +++ b/common/entitybuffer.cpp @@ -56,17 +56,24 @@ void EntityBuffer::extractResourceBuffer(void *dataValue, int dataSize, const st } } -void EntityBuffer::assembleEntityBuffer(flatbuffers::FlatBufferBuilder &fbb, void const *metadataData, size_t metadataSize, void const *resourceData, size_t resourceSize, void const *localData, size_t localSize) +flatbuffers::Offset > EntityBuffer::appendAsVector(flatbuffers::FlatBufferBuilder &fbb, void const *data, size_t size) { - auto metadata = fbb.CreateVector(static_cast(metadataData), metadataSize); - auto resource = fbb.CreateVector(static_cast(resourceData), resourceSize); - auto local = fbb.CreateVector(static_cast(localData), localSize); - auto builder = Akonadi2::EntityBuilder(fbb); - builder.add_metadata(metadata); - builder.add_resource(resource); - builder.add_local(local); + //Since we do memcpy trickery, this will only work on little endian + assert(FLATBUFFERS_LITTLEENDIAN); + auto metadata = fbb.CreateUninitializedVector(size); + { + auto ptr = reinterpret_cast *>(fbb.GetBufferPointer())->Data(); + std::memcpy((void*)ptr, data, size); + } + return metadata; +} - auto buffer = builder.Finish(); - Akonadi2::FinishEntityBuffer(fbb, buffer); +void EntityBuffer::assembleEntityBuffer(flatbuffers::FlatBufferBuilder &fbb, void const *metadataData, size_t metadataSize, void const *resourceData, size_t resourceSize, void const *localData, size_t localSize) +{ + auto metadata = appendAsVector(fbb, metadataData, metadataSize); + auto resource = appendAsVector(fbb, resourceData, resourceSize); + auto local = appendAsVector(fbb, localData, localSize); + auto entity = Akonadi2::CreateEntity(fbb, metadata, resource, local); + Akonadi2::FinishEntityBuffer(fbb, entity); } -- cgit v1.2.3