From 1c8c859a4c1b39fae6596e8c90a237a2b1aa0f09 Mon Sep 17 00:00:00 2001 From: godotg Date: Sat, 27 Jul 2024 12:33:28 +0800 Subject: [PATCH] perf[c++]: use memmove instead of memcpy to improve performance --- protocol/src/main/resources/cpp/ByteBuffer.h | 13 +++++++++---- protocol/src/test/cpp/zfoocpp/ByteBuffer.h | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/protocol/src/main/resources/cpp/ByteBuffer.h b/protocol/src/main/resources/cpp/ByteBuffer.h index c1eae9d1..4ecd4a21 100644 --- a/protocol/src/main/resources/cpp/ByteBuffer.h +++ b/protocol/src/main/resources/cpp/ByteBuffer.h @@ -87,12 +87,17 @@ namespace zfoo { writeInt(length); setWriteOffset(currentWriteIndex); } else { - int8_t *targetPtr = (int8_t *) calloc(length, sizeof(int8_t)); - memcpy(targetPtr, &buffer[currentWriteIndex - length], length); +// int8_t *targetPtr = (int8_t *) calloc(length, sizeof(int8_t)); +// memcpy(targetPtr, &buffer[currentWriteIndex - length], length); +// setWriteOffset(beforeWriteIndex); +// writeInt(length); +// writeBytes(targetPtr, length); +// free(targetPtr); + + memmove(&buffer[beforeWriteIndex + lengthCount], &buffer[currentWriteIndex - length], length); setWriteOffset(beforeWriteIndex); writeInt(length); - writeBytes(targetPtr, length); - free(targetPtr); + setWriteOffset(beforeWriteIndex + lengthCount + length); } } diff --git a/protocol/src/test/cpp/zfoocpp/ByteBuffer.h b/protocol/src/test/cpp/zfoocpp/ByteBuffer.h index c1eae9d1..4ecd4a21 100644 --- a/protocol/src/test/cpp/zfoocpp/ByteBuffer.h +++ b/protocol/src/test/cpp/zfoocpp/ByteBuffer.h @@ -87,12 +87,17 @@ namespace zfoo { writeInt(length); setWriteOffset(currentWriteIndex); } else { - int8_t *targetPtr = (int8_t *) calloc(length, sizeof(int8_t)); - memcpy(targetPtr, &buffer[currentWriteIndex - length], length); +// int8_t *targetPtr = (int8_t *) calloc(length, sizeof(int8_t)); +// memcpy(targetPtr, &buffer[currentWriteIndex - length], length); +// setWriteOffset(beforeWriteIndex); +// writeInt(length); +// writeBytes(targetPtr, length); +// free(targetPtr); + + memmove(&buffer[beforeWriteIndex + lengthCount], &buffer[currentWriteIndex - length], length); setWriteOffset(beforeWriteIndex); writeInt(length); - writeBytes(targetPtr, length); - free(targetPtr); + setWriteOffset(beforeWriteIndex + lengthCount + length); } }