From eb208a6bb555a2e2de0e5f89db9beb1ce726cdcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 17 Jun 2024 15:11:51 +0200 Subject: [PATCH] compressEvents: simplify TimerEvent compression While better in some benchmarks, it turns out to be less efficient to first find an event to the receiver, and then checking the event-ptr and -type in other benchmarks, compared to just iterating the list and checking these values. Partially reverts 3e6b42ae9dbf4f90ba890d78a4c49f9936f4976b Fixes: QTBUG-126394 Pick-to: 6.7 Change-Id: I748bda3d31350aea6e87db9bd57359ab17cf5d67 Reviewed-by: Thiago Macieira Reviewed-by: YAMAMOTO Atsushi - Signal Slot (cherry picked from commit b039d2251a14281947a43e226bae6c6fbae7312a) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qcoreapplication.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 4262c14405e..a18e3630b37 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1729,18 +1729,17 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven int receiverPostedEvents = receiver->d_func()->postedEvents.loadRelaxed(); // compress posted timers to this object. if (event->type() == QEvent::Timer && receiverPostedEvents > 0) { - int timerId = static_cast(event)->timerId(); - auto sameReceiver = [receiver](const QPostEvent &e) { return e.receiver == receiver; }; - auto it = std::find_if(postedEvents->cbegin(), postedEvents->cend(), sameReceiver); - while (receiverPostedEvents > 0 && it != postedEvents->cend()) { - if (it->event && it->event->type() == QEvent::Timer - && static_cast(it->event)->timerId() == timerId) { - delete event; - return true; + const int timerId = static_cast(event)->timerId(); + auto it = postedEvents->cbegin(); + const auto end = postedEvents->cend(); + while (it != end) { + if (it->event && it->event->type() == QEvent::Timer && it->receiver == receiver) { + if (static_cast(it->event)->timerId() == timerId) { + delete event; + return true; + } } - - if (--receiverPostedEvents) - it = std::find_if(it + 1, postedEvents->cend(), sameReceiver); + ++it; } return false; }