From ff31bb86bc9e49f080220bcaf5a5bceeb99c9e30 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Thu, 30 Jan 2020 13:37:46 +0800 Subject: [PATCH] Speed up lookup time By adding another variable we can get O(1) lookup time instead of O(n). Fix up 5f415c292ddc2ea13015a2bec42f9f6b710ed732. --- src/gui/properties/peerlistwidget.cpp | 20 ++++++++++++-------- src/gui/properties/peerlistwidget.h | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index e4d764e65..cc40c39d5 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -328,6 +328,7 @@ void PeerListWidget::copySelectedPeers() void PeerListWidget::clear() { m_peerItems.clear(); + m_itemsByIP.clear(); const int nbrows = m_listModel->rowCount(); if (nbrows > 0) m_listModel->removeRows(0, nbrows); @@ -365,7 +366,13 @@ void PeerListWidget::loadPeers(const BitTorrent::TorrentHandle *torrent) // Remove peers that are gone for (const PeerEndpoint &peerEndpoint : asConst(existingPeers)) { - const QStandardItem *item = m_peerItems.take(peerEndpoint); + QStandardItem *item = m_peerItems.take(peerEndpoint); + + QSet &items = m_itemsByIP[peerEndpoint.address.ip]; + items.remove(item); + if (items.isEmpty()) + m_itemsByIP.remove(peerEndpoint.address.ip); + m_listModel->removeRow(item->row()); } } @@ -387,6 +394,7 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const m_listModel->setData(m_listModel->index(row, PeerListDelegate::IP_HIDDEN), peerIp); itemIter = m_peerItems.insert(peerEndpoint, m_listModel->item(row, PeerListDelegate::IP)); + m_itemsByIP[peerEndpoint.address.ip].insert(itemIter.value()); } const int row = (*itemIter)->row(); @@ -420,13 +428,9 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const void PeerListWidget::handleResolved(const QHostAddress &ip, const QString &hostname) const { - for (auto iter = m_peerItems.cbegin(); iter != m_peerItems.cend(); ++iter) { - if (iter.key().address.ip == ip) { - QStandardItem *item {iter.value()}; - item->setData(hostname, Qt::DisplayRole); - break; - } - } + const QSet items = m_itemsByIP.value(ip); + for (QStandardItem *item : items) + item->setData(hostname, Qt::DisplayRole); } void PeerListWidget::handleSortColumnChanged(const int col) diff --git a/src/gui/properties/peerlistwidget.h b/src/gui/properties/peerlistwidget.h index f57d807e5..ca05acc82 100644 --- a/src/gui/properties/peerlistwidget.h +++ b/src/gui/properties/peerlistwidget.h @@ -30,6 +30,7 @@ #define PEERLISTWIDGET_H #include +#include #include class QHostAddress; @@ -85,6 +86,7 @@ private: PropertiesWidget *m_properties = nullptr; Net::ReverseResolution *m_resolver = nullptr; QHash m_peerItems; + QHash> m_itemsByIP; // must be kept in sync with `m_peerItems` bool m_resolveCountries; };