[LyX/master] Do not run updateMacros if the buffer has not changed

Jean-Marc Lasgouttes lasgouttes at lyx.org
Wed Jul 24 16:36:08 UTC 2024


Le 24/07/2024 à 18:31, Jean-Marc Lasgouttes a écrit :
> commit 999fb37ebb1aecfda9889fa6a2b2fbb15133f2aa
> Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
> Date:   Sat Jul 20 22:31:34 2024 +0200
> 
>      Do not run updateMacros if the buffer has not changed
>      
>      Each buffer now has an id which is increased when it is marked dirty
>      (or when one of its relatives is marked dirty).
>      
>      This can be a big win since updateMacros is very expensive.

Riki, I propose to consider this for 2.4.X. There is no hurry, it can be 
2.4.3. We could also add the "smoother scroll" patch although we would 
have to test it to see if the performance is still good. It should be, I 
did not add that many things in master that make a difference.

JMarc

> ---
>   src/Buffer.cpp | 27 +++++++++++++++++++++++++++
>   src/Buffer.h   |  6 ++++++
>   src/Undo.cpp   |  6 ++++--
>   3 files changed, 37 insertions(+), 2 deletions(-)
> 
> diff --git a/src/Buffer.cpp b/src/Buffer.cpp
> index 6c1619151c..59733d852e 100644
> --- a/src/Buffer.cpp
> +++ b/src/Buffer.cpp
> @@ -254,6 +254,11 @@ public:
>   	///
>   	Undo undo_;
>   
> +	/// This is increased every time the buffer or one of its relatives is marked dirty
> +	int id_ = 0;
> +	/// The buffer id at last updateMacros invokation
> +	int update_macros_id_ = -1;
> +
>   	/// A cache for the bibfiles (including bibfiles of loaded child
>   	/// documents), needed for appropriate update of natbib labels.
>   	mutable docstring_list bibfiles_cache_;
> @@ -790,6 +795,20 @@ Undo const & Buffer::undo() const
>   }
>   
>   
> +int Buffer::id() const
> +{
> +	return d->id_;
> +}
> +
> +
> +void Buffer::updateId()
> +{
> +	++d->id_;
> +	for(Buffer * b : allRelatives())
> +		++(b->d->id_);
> +}
> +
> +
>   void Buffer::setChild(DocIterator const & dit, Buffer * child)
>   {
>   	d->children_positions[child] = dit;
> @@ -3305,6 +3324,9 @@ void Buffer::markDirty()
>   
>   	for (auto & depit : d->dep_clean)
>   		depit.second = false;
> +
> +	// Update the buffer and its relatives' ids.
> +	updateId();
>   }
>   
>   
> @@ -3899,6 +3921,11 @@ void Buffer::updateMacros() const
>   	if (d->macro_lock)
>   		return;
>   
> +	// early exit if the buffer has not changed since last time
> +	if (d->update_macros_id_ == d->id_)
> +		return;
> +	d->update_macros_id_ = d->id_;
> +
>   	LYXERR(Debug::MACROS, "updateMacro of " << d->filename.onlyFileName());
>   
>   	// start with empty table
> diff --git a/src/Buffer.h b/src/Buffer.h
> index fd4d8bc8e3..2cd1495796 100644
> --- a/src/Buffer.h
> +++ b/src/Buffer.h
> @@ -661,6 +661,12 @@ public:
>   	///
>   	Undo const & undo() const;
>   
> +	/// poor man versioning of the buffer (and its relatives).
> +	int id() const;
> +	/// change the id of this buffer and its relatives (indicating
> +	/// something has changed). This is currently used by updateMacros().
> +	void updateId();
> +
>   	/// This function is called when the buffer is changed.
>   	void changed(bool update_metrics) const;
>   	///
> diff --git a/src/Undo.cpp b/src/Undo.cpp
> index 80dff34baa..5eb29bf7a0 100644
> --- a/src/Undo.cpp
> +++ b/src/Undo.cpp
> @@ -529,9 +529,11 @@ void Undo::Private::doUndoRedoAction(CursorData & cur, UndoElementStack & stack,
>   
>   	if (!undo.cur_before.empty())
>   		cur = undo.cur_before;
> -	if (undo.lyx_clean)
> +	if (undo.lyx_clean) {
>   		buffer_.markClean();
> -	else
> +		// since we have changed the buffer, update its id.
> +		buffer_.updateId();
> +	} else
>   		buffer_.markDirty();
>   	// Now that we're done with undo, we pop it off the stack.
>   	stack.pop();



More information about the lyx-devel mailing list