Commit 9fbf7a0b authored by Jaime Torres Amate's avatar Jaime Torres Amate

Faster drag&drop in directories with thousands of files

Summary:
The check is called when the mouse is moved in a drag&drop operation.

Dragging all files in a directory with 3000 files under callgrind,
moving the mouse to the other panel and then canceling, doing it twice,
callgrind shows that the method urlListMatchesUrl is called around
200 times, spending around 9,30% of the cpu in those calls.
Applying the patch, callgrind tells it uses now 0.31% of the cpu in 1208 calls.

CCBUG: 342056

Reviewers: #dolphin, elvisangelaccio, markg

Reviewed By: #dolphin, elvisangelaccio, markg

Subscribers: markg, anthonyfieroni, michaelh, elvisangelaccio, ngraham

Differential Revision: https://phabricator.kde.org/D10085
parent 20d57ab4
......@@ -849,6 +849,9 @@ bool KItemListController::dragEnterEvent(QGraphicsSceneDragDropEvent* event, con
{
Q_UNUSED(event);
Q_UNUSED(transform);
DragAndDropHelper::clearUrlListMatchesUrlCache();
return false;
}
......
......@@ -29,12 +29,21 @@
#include <KIO/DropJob>
#include <KJobWidgets>
QHash<QUrl, bool> DragAndDropHelper::m_urlListMatchesUrlCache;
bool DragAndDropHelper::urlListMatchesUrl(const QList<QUrl>& urls, const QUrl& destUrl)
{
return std::find_if(urls.constBegin(), urls.constEnd(), [destUrl](const QUrl& url) {
return url.matches(destUrl, QUrl::StripTrailingSlash);
}) != urls.constEnd();
auto iteratorResult = m_urlListMatchesUrlCache.constFind(destUrl);
if (iteratorResult != m_urlListMatchesUrlCache.constEnd()) {
return *iteratorResult;
}
const bool destUrlMatches =
std::find_if(urls.constBegin(), urls.constEnd(), [destUrl](const QUrl& url) {
return url.matches(destUrl, QUrl::StripTrailingSlash);
}) != urls.constEnd();
return *m_urlListMatchesUrlCache.insert(destUrl, destUrlMatches);
}
KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget* window)
......@@ -63,3 +72,8 @@ KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event
return nullptr;
}
void DragAndDropHelper::clearUrlListMatchesUrlCache()
{
DragAndDropHelper::m_urlListMatchesUrlCache.clear();
}
......@@ -54,6 +54,16 @@ public:
* @return True if destUrl is contained in the urls parameter.
*/
static bool urlListMatchesUrl(const QList<QUrl>& urls, const QUrl& destUrl);
/**
* clear the internal cache.
*/
static void clearUrlListMatchesUrlCache();
private:
/**
* Stores the results of the expensive checks made in urlListMatchesUrl.
*/
static QHash<QUrl, bool> m_urlListMatchesUrlCache;
};
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment