diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2025-02-03 10:56:52 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2025-02-03 11:53:37 +0200 |
| commit | 0739820819dbbab9ebd4b91efc2dbda775d2f313 (patch) | |
| tree | ba8ab0133b2163369c14be846afaeef30d06789a /log_db/src/common.rs | |
| parent | de254873cfd40f2ef2e77bcffb3bf0f9ec0b1c0b (diff) | |
Optimize buffer construction
Diffstat (limited to 'log_db/src/common.rs')
| -rw-r--r-- | log_db/src/common.rs | 45 |
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 } } |
