1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-01-12 07:48:04 +00:00

Speed up lookup time

By adding another variable we can get O(1) lookup time instead of O(n).
Fix up 5f415c292d.
This commit is contained in:
Chocobo1 2020-01-30 13:37:46 +08:00
parent a2ebd77eac
commit ff31bb86bc
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
2 changed files with 14 additions and 8 deletions

View File

@ -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<QStandardItem *> &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<QStandardItem *> items = m_itemsByIP.value(ip);
for (QStandardItem *item : items)
item->setData(hostname, Qt::DisplayRole);
}
void PeerListWidget::handleSortColumnChanged(const int col)

View File

@ -30,6 +30,7 @@
#define PEERLISTWIDGET_H
#include <QHash>
#include <QSet>
#include <QTreeView>
class QHostAddress;
@ -85,6 +86,7 @@ private:
PropertiesWidget *m_properties = nullptr;
Net::ReverseResolution *m_resolver = nullptr;
QHash<PeerEndpoint, QStandardItem *> m_peerItems;
QHash<QHostAddress, QSet<QStandardItem *>> m_itemsByIP; // must be kept in sync with `m_peerItems`
bool m_resolveCountries;
};