From 333978f1ff6b9f71b97239eac52b901240e76aea Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Sun, 12 Oct 2014 11:26:19 +0400 Subject: [PATCH] Use std::vector instead of std::deque in QAlertDispatcher As we never use {push,pop}_front std::vector works here perfectly. Also reserve memory for std::vector out of lock. This could be considered as an optimization, but in reality this is just using right container in right place. According to my measurements total speedup is under 0.2%. --- src/qtlibtorrent/alertdispatcher.cpp | 9 +++++++-- src/qtlibtorrent/alertdispatcher.h | 6 +++--- src/qtlibtorrent/qbtsession.cpp | 6 +++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/qtlibtorrent/alertdispatcher.cpp b/src/qtlibtorrent/alertdispatcher.cpp index b9d3a7a53..1bcfed64e 100644 --- a/src/qtlibtorrent/alertdispatcher.cpp +++ b/src/qtlibtorrent/alertdispatcher.cpp @@ -33,12 +33,15 @@ #include #include +const size_t DEFAULT_ALERTS_CAPACITY = 32; + QAlertDispatcher::QAlertDispatcher(libtorrent::session *session, QObject* parent) : QObject(parent) , m_session(session) , current_tag(new QAtomicPointer(this)) , event_posted(false) { + alerts.reserve(DEFAULT_ALERTS_CAPACITY); m_session->set_alert_dispatch(boost::bind(&QAlertDispatcher::dispatch, current_tag, _1)); } @@ -60,16 +63,18 @@ QAlertDispatcher::~QAlertDispatcher() { m_session->set_alert_dispatch(dispatch_function_t()); } -void QAlertDispatcher::getPendingAlertsNoWait(std::deque& out) { +void QAlertDispatcher::getPendingAlertsNoWait(std::vector& out) { Q_ASSERT(out.empty()); + out.reserve(DEFAULT_ALERTS_CAPACITY); QMutexLocker lock(&alerts_mutex); alerts.swap(out); event_posted = false; } -void QAlertDispatcher::getPendingAlerts(std::deque& out, unsigned long time) { +void QAlertDispatcher::getPendingAlerts(std::vector& out, unsigned long time) { Q_ASSERT(out.empty()); + out.reserve(DEFAULT_ALERTS_CAPACITY); QMutexLocker lock(&alerts_mutex); diff --git a/src/qtlibtorrent/alertdispatcher.h b/src/qtlibtorrent/alertdispatcher.h index a107bf4e1..b9d097f24 100644 --- a/src/qtlibtorrent/alertdispatcher.h +++ b/src/qtlibtorrent/alertdispatcher.h @@ -46,8 +46,8 @@ public: QAlertDispatcher(libtorrent::session *session, QObject* parent); ~QAlertDispatcher(); - void getPendingAlertsNoWait(std::deque&); - void getPendingAlerts(std::deque&, unsigned long time = ULONG_MAX); + void getPendingAlertsNoWait(std::vector&); + void getPendingAlerts(std::vector&, unsigned long time = ULONG_MAX); signals: void alertsReceived(); @@ -64,7 +64,7 @@ private: libtorrent::session *m_session; QMutex alerts_mutex; QWaitCondition alerts_condvar; - std::deque alerts; + std::vector alerts; QSharedPointer > current_tag; bool event_posted; }; diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index 818cff613..f8378fc5a 100755 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -1649,7 +1649,7 @@ void QBtSession::saveFastResumeData() { } catch(libtorrent::invalid_handle&) {} } while (num_resume_data > 0) { - std::deque alerts; + std::vector alerts; m_alertDispatcher->getPendingAlerts(alerts, 30*1000); if (alerts.empty()) { std::cerr << " aborting with " << num_resume_data << " outstanding " @@ -1657,7 +1657,7 @@ void QBtSession::saveFastResumeData() { break; } - for (std::deque::const_iterator i = alerts.begin(), end = alerts.end(); i != end; ++i) + for (std::vector::const_iterator i = alerts.begin(), end = alerts.end(); i != end; ++i) { alert const* a = *i; // Saving fastresume data can fail @@ -2147,7 +2147,7 @@ void QBtSession::sendNotificationEmail(const QTorrentHandle &h) { // Read alerts sent by the Bittorrent session void QBtSession::readAlerts() { - typedef std::deque alerts_t; + typedef std::vector alerts_t; alerts_t alerts; m_alertDispatcher->getPendingAlertsNoWait(alerts);