aboutsummaryrefslogtreecommitdiffstats
path: root/log_db/src/common.rs
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-02-03 10:56:52 +0200
committerJan Tuomi <jan@jantuomi.fi>2025-02-03 11:53:37 +0200
commit0739820819dbbab9ebd4b91efc2dbda775d2f313 (patch)
treeba8ab0133b2163369c14be846afaeef30d06789a /log_db/src/common.rs
parentde254873cfd40f2ef2e77bcffb3bf0f9ec0b1c0b (diff)
Optimize buffer construction
Diffstat (limited to 'log_db/src/common.rs')
-rw-r--r--log_db/src/common.rs45
1 files changed, 22 insertions, 23 deletions
diff --git a/log_db/src/common.rs b/log_db/src/common.rs
index d4a95b5..3e06db5 100644
--- a/log_db/src/common.rs
+++ b/log_db/src/common.rs
@@ -170,14 +170,11 @@ pub struct MetadataHeader {
const METADATA_HEADER_PADDING: &[u8] = &[0; 7];
impl MetadataHeader {
- pub fn serialize(&self) -> Vec<u8> {
- let uuid_bytes = self.uuid.as_bytes().to_vec();
-
- let mut header = vec![self.version];
- header.extend(METADATA_HEADER_PADDING);
- header.extend(uuid_bytes);
-
- assert_eq!(header.len(), METADATA_FILE_HEADER_SIZE);
+ pub fn serialize(&self) -> [u8; METADATA_FILE_HEADER_SIZE] {
+ let mut header = [0u8; METADATA_FILE_HEADER_SIZE];
+ header[0] = self.version;
+ header[1..8].copy_from_slice(METADATA_HEADER_PADDING);
+ header[8..].copy_from_slice(self.uuid.as_bytes());
header
}
@@ -278,31 +275,33 @@ impl Eq for Value {}
impl Value {
pub fn serialize(&self) -> Vec<u8> {
match self {
- Value::Null => {
- vec![B_NULL]
- }
+ Value::Null => vec![B_NULL],
Value::Int(i) => {
- let mut bytes = vec![B_INT];
- bytes.extend(i.to_be_bytes());
+ let mut bytes = Vec::with_capacity(1 + 16);
+ bytes.push(B_INT);
+ bytes.extend_from_slice(&i.to_be_bytes());
bytes
}
Value::Decimal(d) => {
- let mut bytes = vec![B_DECIMAL];
- bytes.extend(d.serialize()); // 16 bytes
+ let mut bytes = Vec::with_capacity(1 + 16);
+ bytes.push(B_DECIMAL);
+ bytes.extend_from_slice(&d.serialize());
bytes
}
Value::String(s) => {
- let mut bytes = vec![B_STRING];
- let length = s.len() as u64;
- bytes.extend(length.to_be_bytes());
- bytes.extend(s.as_bytes());
+ let len = s.len();
+ let mut bytes = Vec::with_capacity(1 + 8 + len);
+ bytes.push(B_STRING);
+ bytes.extend_from_slice(&(len as u64).to_be_bytes());
+ bytes.extend_from_slice(s.as_bytes());
bytes
}
Value::Bytes(b) => {
- let mut bytes = vec![B_BYTES];
- let length = b.len() as u64;
- bytes.extend(length.to_be_bytes());
- bytes.extend(b);
+ let len = b.len();
+ let mut bytes = Vec::with_capacity(1 + 8 + len);
+ bytes.push(B_BYTES);
+ bytes.extend_from_slice(&(len as u64).to_be_bytes());
+ bytes.extend_from_slice(b);
bytes
}
}