From 370572592c01fe33fa69f1e19e78e8c7005128c4 Mon Sep 17 00:00:00 2001 From: Pavel Ivanov Date: Sun, 28 Jan 2024 12:59:20 +0100 Subject: [PATCH] new: minor performance improvement --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/app.rs | 14 +++++++------- src/scanning.rs | 5 ++--- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e32fefde..51082b0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -717,7 +717,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hl" -version = "0.25.1-beta.3" +version = "0.25.1-beta.4" dependencies = [ "atoi", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 5ef3df00..6629fdf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ categories = ["command-line-utilities"] description = "Utility for viewing json-formatted log files." keywords = ["cli", "human", "log"] name = "hl" -version = "0.25.1-beta.3" +version = "0.25.1-beta.4" edition = "2021" build = "build.rs" diff --git a/src/app.rs b/src/app.rs index a41d4df4..8e32ee8d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -17,7 +17,7 @@ use std::os::unix::fs::MetadataExt; // third-party imports use closure::closure; -use crossbeam_channel::{self as channel, Receiver, RecvError, Sender,RecvTimeoutError}; +use crossbeam_channel::{self as channel, Receiver, RecvError, Sender, RecvTimeoutError}; use crossbeam_utils::thread; use itertools::{izip, Itertools}; use platform_dirs::AppDirs; @@ -34,7 +34,7 @@ use crate::formatting::{RecordFormatter, RecordWithSourceFormatter, RawRecordFor use crate::index::{Indexer, Timestamp}; use crate::input::{BlockLine, InputHolder, InputReference, Input}; use crate::model::{Filter, Parser, ParserSettings, RawRecord, Record, RecordFilter, RecordWithSourceConstructor}; -use crate::scanning::{BufFactory, Scanner, Segment, SegmentBufFactory}; +use crate::scanning::{BufFactory, Scanner, Segment, SegmentBuf, SegmentBufFactory}; use crate::serdex::StreamDeserializerWithOffsets; use crate::settings::{Fields, Formatting}; use crate::theme::{Element, StylingPush, Theme}; @@ -132,7 +132,7 @@ impl App { // prepare receive/transmit channels for input data let (txi, rxi): (Vec<_>, Vec<_>) = (0..n).map(|_| channel::bounded(1)).unzip(); // prepare receive/transmit channels for output data - let (txo, rxo): (Vec<_>, Vec<_>) = (0..n).into_iter().map(|_| channel::bounded::<(usize, Vec)>(1)).unzip(); + let (txo, rxo): (Vec<_>, Vec<_>) = (0..n).into_iter().map(|_| channel::bounded::<(usize, SegmentBuf)>(1)).unzip(); // spawn reader thread let reader = scope.spawn(closure!(clone sfi, |_| -> Result<()> { let mut tx = StripedSender::new(txi); @@ -157,12 +157,12 @@ impl App { let mut buf = bfo.new_buf(); processor.process(segment.data(), &mut buf, prefix, &mut RecordIgnorer{}); sfi.recycle(segment); - if let Err(_) = txo.send((i, buf)) { + if let Err(_) = txo.send((i, buf.into())) { break; }; } Segment::Incomplete(segment, _) => { - if let Err(_) = txo.send((i, segment.to_vec())) { + if let Err(_) = txo.send((i, segment)) { break; } } @@ -173,8 +173,8 @@ impl App { // spawn writer thread let writer = scope.spawn(closure!(ref bfo, |_| -> Result<()> { for (_, buf) in StripedReceiver::new(rxo) { - output.write_all(&buf[..])?; - bfo.recycle(buf); + output.write_all(buf.data())?; + bfo.recycle(buf.into_inner()); } Ok(()) })); diff --git a/src/scanning.rs b/src/scanning.rs index e0cf8a4b..5ca775b0 100644 --- a/src/scanning.rs +++ b/src/scanning.rs @@ -47,8 +47,7 @@ impl SegmentBuf { } /// Converts the SegmentBuf to a Vec. - pub fn to_vec(mut self) -> Vec { - self.data.resize(self.size, 0); + pub fn into_inner(self) -> Vec { self.data } @@ -110,7 +109,7 @@ impl> From for SegmentBuf { // --- /// Segment is an output of Scanner. -/// Complete segment cantains a whole number of tokens. +/// Complete segment contains a whole number of tokens. /// Incomplete segment contains a part of a token. #[derive(Debug, Eq, PartialEq)] pub enum Segment {