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.

(cherry picked from commit 999fb37ebb)
(cherry picked from commit fe1a3b57df)
This commit is contained in:
Jean-Marc Lasgouttes 2024-07-20 22:31:34 +02:00
parent 63165a95d5
commit e2cf6731c0
4 changed files with 40 additions and 2 deletions

View File

@ -253,6 +253,11 @@ public:
/// ///
Undo undo_; 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 /// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels. /// documents), needed for appropriate update of natbib labels.
mutable docstring_list bibfiles_cache_; mutable docstring_list bibfiles_cache_;
@ -808,6 +813,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) void Buffer::setChild(DocIterator const & dit, Buffer * child)
{ {
d->children_positions[child] = dit; d->children_positions[child] = dit;
@ -3322,6 +3341,9 @@ void Buffer::markDirty()
for (auto & depit : d->dep_clean) for (auto & depit : d->dep_clean)
depit.second = false; depit.second = false;
// Update the buffer and its relatives' ids.
updateId();
} }
@ -3916,6 +3938,11 @@ void Buffer::updateMacros() const
if (d->macro_lock) if (d->macro_lock)
return; return;
// early exit if the buffer has not changed since last time
if (d->gui_ && d->update_macros_id_ == d->id_)
return;
d->update_macros_id_ = d->id_;
LYXERR(Debug::MACROS, "updateMacro of " << d->filename.onlyFileName()); LYXERR(Debug::MACROS, "updateMacro of " << d->filename.onlyFileName());
// start with empty table // start with empty table

View File

@ -660,6 +660,12 @@ public:
/// ///
Undo const & undo() const; 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. /// This function is called when the buffer is changed.
void changed(bool update_metrics) const; void changed(bool update_metrics) const;
/// ///

View File

@ -512,9 +512,11 @@ void Undo::Private::doUndoRedoAction(CursorData & cur, UndoElementStack & stack,
if (!undo.cur_before.empty()) if (!undo.cur_before.empty())
cur = undo.cur_before; cur = undo.cur_before;
if (undo.lyx_clean) if (undo.lyx_clean) {
buffer_.markClean(); buffer_.markClean();
else // since we have changed the buffer, update its id.
buffer_.updateId();
} else
buffer_.markDirty(); buffer_.markDirty();
// Now that we're done with undo, we pop it off the stack. // Now that we're done with undo, we pop it off the stack.
stack.pop(); stack.pop();

View File

@ -54,6 +54,9 @@ What's new
- fix crash when using Save As... with previews enabled (bug 13091). - fix crash when using Save As... with previews enabled (bug 13091).
- Speedup interactive use by avoiding expensive math macros bookkeeping
when possible.
* DOCUMENTATION AND LOCALIZATION * DOCUMENTATION AND LOCALIZATION