From ebe3d434e453a5c48f58e32a574b2a358a93ee6b Mon Sep 17 00:00:00 2001 From: Remzi Yang <59198230+HaoYang670@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:41:14 +0800 Subject: [PATCH] avoid useless copies (#2510) Signed-off-by: remzi <13716567376yh@gmail.com> Signed-off-by: remzi <13716567376yh@gmail.com> --- arrow/src/ipc/compression/codec.rs | 8 +++----- arrow/src/ipc/reader.rs | 11 ++++------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/arrow/src/ipc/compression/codec.rs b/arrow/src/ipc/compression/codec.rs index 9d870fc2224..58ba8cb8658 100644 --- a/arrow/src/ipc/compression/codec.rs +++ b/arrow/src/ipc/compression/codec.rs @@ -92,18 +92,16 @@ impl CompressionCodec { /// [8 bytes]: uncompressed length /// [remaining bytes]: compressed data stream /// ``` - pub(crate) fn decompress_to_buffer(&self, input: &[u8]) -> Result { + pub(crate) fn decompress_to_buffer(&self, input: &Buffer) -> Result { // read the first 8 bytes to determine if the data is // compressed let decompressed_length = read_uncompressed_size(input); let buffer = if decompressed_length == 0 { // emtpy - let empty = Vec::::new(); - Buffer::from(empty) + Buffer::from([]) } else if decompressed_length == LENGTH_NO_COMPRESSED_DATA { // no compression - let data = &input[(LENGTH_OF_PREFIX_DATA as usize)..]; - Buffer::from(data) + input.slice(LENGTH_OF_PREFIX_DATA as usize) } else { // decompress data using the codec let mut uncompressed_buffer = diff --git a/arrow/src/ipc/reader.rs b/arrow/src/ipc/reader.rs index 393128371b1..8335fa4bc9e 100644 --- a/arrow/src/ipc/reader.rs +++ b/arrow/src/ipc/reader.rs @@ -53,14 +53,11 @@ fn read_buffer( ) -> Result { let start_offset = buf.offset() as usize; let end_offset = start_offset + buf.length() as usize; - let buf_data = &a_data[start_offset..end_offset]; + let buf_data = Buffer::from(&a_data[start_offset..end_offset]); // corner case: empty buffer - if buf_data.is_empty() { - return Ok(Buffer::from(buf_data)); - } - match compression_codec { - Some(decompressor) => decompressor.decompress_to_buffer(buf_data), - None => Ok(Buffer::from(buf_data)), + match (buf_data.is_empty(), compression_codec) { + (true, _) | (_, None) => Ok(buf_data), + (false, Some(decompressor)) => decompressor.decompress_to_buffer(&buf_data), } }