From 9023232653ba028ed03c9ce008105c225ff5506d Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Sun, 9 Nov 2014 11:52:28 +0300 Subject: [PATCH] Cache icons in TorrentContentModel This commit caches icons in TorrentContentModel in the same way they are cached in TorrentModel. This commit should improve performance when user navigating through torrent list using up/down keys. A scrolling through all the list (276 torrents) took: Total wall time: 18.813s Total CPU time: 3.210s IconProvider::generateDifferentSizes(): 0.170s IconProvider::generateDifferentSizes is 5th most hottest function on this use case. --- src/torrentcontentmodel.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/torrentcontentmodel.cpp b/src/torrentcontentmodel.cpp index baf233a4e..97e8242b3 100644 --- a/src/torrentcontentmodel.cpp +++ b/src/torrentcontentmodel.cpp @@ -37,6 +37,18 @@ #include "torrentcontentmodelfile.h" #include +namespace { +QIcon get_directory_icon() { + static QIcon cached = IconProvider::instance()->getIcon("inode-directory"); + return cached; +} + +QIcon get_file_icon() { + static QIcon cached = IconProvider::instance()->getIcon("text-plain"); + return cached; +} +} + TorrentContentModel::TorrentContentModel(QObject *parent): QAbstractItemModel(parent), m_rootItem(new TorrentContentModelFolder(QList() << tr("Name") << tr("Size") @@ -169,9 +181,9 @@ QVariant TorrentContentModel::data(const QModelIndex& index, int role) const TorrentContentModelItem* item = static_cast(index.internalPointer()); if (index.column() == 0 && role == Qt::DecorationRole) { if (item->itemType() == TorrentContentModelItem::FolderType) - return IconProvider::instance()->getIcon("inode-directory"); + return get_directory_icon(); else - return IconProvider::instance()->getIcon("text-plain"); + return get_file_icon(); } if (index.column() == 0 && role == Qt::CheckStateRole) { if (item->data(TorrentContentModelItem::COL_PRIO).toInt() == prio::IGNORED)