From 5664ee7bdaaeaf124499697310cc2ddbf5955306 Mon Sep 17 00:00:00 2001 From: Reilly Wood <26268125+rgwood@users.noreply.github.com> Date: Tue, 10 Jan 2023 17:22:32 -0800 Subject: [PATCH] Remove `engine_state` clones in REPL eval (#7713) A small but easy optimization for `evaluate_repl()`: clone `engine_state` 1x instead of 3x. This reduces time spent in a simple REPL eval (`enter` key pressed with no command text) by about 10%, as measured in [Superluminal](https://superluminal.eu/). --- crates/nu-cli/src/nu_highlight.rs | 2 +- crates/nu-cli/src/repl.rs | 4 ++-- crates/nu-cli/src/syntax_highlight.rs | 3 ++- crates/nu-cli/src/validation.rs | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/nu-cli/src/nu_highlight.rs b/crates/nu-cli/src/nu_highlight.rs index 17a0ae53d..5c1e74f77 100644 --- a/crates/nu-cli/src/nu_highlight.rs +++ b/crates/nu-cli/src/nu_highlight.rs @@ -35,7 +35,7 @@ impl Command for NuHighlight { let head = call.head; let ctrlc = engine_state.ctrlc.clone(); - let engine_state = engine_state.clone(); + let engine_state = std::sync::Arc::new(engine_state.clone()); let config = engine_state.get_config().clone(); let highlighter = crate::NuHighlighter { diff --git a/crates/nu-cli/src/repl.rs b/crates/nu-cli/src/repl.rs index 851be4450..9d5acda29 100644 --- a/crates/nu-cli/src/repl.rs +++ b/crates/nu-cli/src/repl.rs @@ -176,11 +176,11 @@ pub fn evaluate_repl( let engine_reference = std::sync::Arc::new(engine_state.clone()); line_editor = line_editor .with_highlighter(Box::new(NuHighlighter { - engine_state: engine_state.clone(), + engine_state: engine_reference.clone(), config: config.clone(), })) .with_validator(Box::new(NuValidator { - engine_state: engine_state.clone(), + engine_state: engine_reference.clone(), })) .with_completer(Box::new(NuCompleter::new( engine_reference.clone(), diff --git a/crates/nu-cli/src/syntax_highlight.rs b/crates/nu-cli/src/syntax_highlight.rs index 9d2258fda..25e0384cf 100644 --- a/crates/nu-cli/src/syntax_highlight.rs +++ b/crates/nu-cli/src/syntax_highlight.rs @@ -6,9 +6,10 @@ use nu_protocol::ast::{Argument, Block, Expr, Expression, PipelineElement}; use nu_protocol::engine::{EngineState, StateWorkingSet}; use nu_protocol::{Config, Span}; use reedline::{Highlighter, StyledText}; +use std::sync::Arc; pub struct NuHighlighter { - pub engine_state: EngineState, + pub engine_state: Arc, pub config: Config, } diff --git a/crates/nu-cli/src/validation.rs b/crates/nu-cli/src/validation.rs index 8b31932c3..a53e617b0 100644 --- a/crates/nu-cli/src/validation.rs +++ b/crates/nu-cli/src/validation.rs @@ -1,9 +1,10 @@ use nu_parser::{parse, ParseError}; use nu_protocol::engine::{EngineState, StateWorkingSet}; use reedline::{ValidationResult, Validator}; +use std::sync::Arc; pub struct NuValidator { - pub engine_state: EngineState, + pub engine_state: Arc, } impl Validator for NuValidator {