]> git.lyx.org Git - lyx.git/commitdiff
Do not run updateMacros if the buffer has not changed
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 20 Jul 2024 20:31:34 +0000 (22:31 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 24 Jul 2024 16:29:43 +0000 (18:29 +0200)
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.

src/Buffer.cpp
src/Buffer.h
src/Undo.cpp

index 6c1619151c4e96137b68866abcc995a85e1a6fad..59733d852ed13c02af75eb4b1b885ded995ed299 100644 (file)
@@ -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
index fd4d8bc8e3189e7568003d1fdb714c3b62a27626..2cd1495796f0a515a51c9b6769190d2ee7573035 100644 (file)
@@ -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;
        ///
index 80dff34baa138e57ff643dd762f32258d220cc96..5eb29bf7a0da16173dc138c0e3779972f43757f2 100644 (file)
@@ -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();