KFileItem optimization
Jakub Stachowski <[email protected]> Sat, 3 Jan 2009 15:32:58 +0100
| Newsgroups | gmane.comp.kde.devel.optimize |
|---|---|
| Message-ID | <[email protected]> |
--Boundary-00=_ac3XJl4bEfAR+cr
Content-Type: multipart/alternative;
boundary="Boundary-00=_ac3XJpUTdCe7A+P"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--Boundary-00=_ac3XJpUTdCe7A+P
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Hello,
After entering large directory but before displaying its contents, Dolphin
spends some time laying out item in a view
(QListViewPrivate::doItemsLayout()). Of that time about 42% is spent getting
icon name for each KFileItem. It is slow operation, because of mime-
>is("application/x-desktop") check, which constructs KMimeType object for
application/x-desktop type again and again. Attached patch adds fast path to
KMimeType::is by allowing to ignore resolving aliases. It is not a problem in
case of KFileItem, because application/x-desktop is not an alias.
This makes KFileItem::iconName() about 4x times faster on first use.
It messes with kdecore so I would like to get second opinion on this patch.
Another possible optimization: for each item, KFileItemDelegate checks actual
size of file icon. Is this really necessary? Or maybe it would be enough to
check size for first icon in the view and then reuse it.
--Boundary-00=_ac3XJpUTdCe7A+P
Content-Type: text/html;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">Hello,<br /><br>
<br /><br>
After entering large directory but before displaying its contents, Dolphin spends some time laying out item in a view (QListViewPrivate::doItemsLayout()). Of that time about 42% is spent getting icon name for each KFileItem. It is slow operation, because of mime->is("application/x-desktop") check, which constructs KMimeType object for application/x-desktop type again and again. Attached patch adds fast path to KMimeType::is by allowing to ignore resolving aliases. It is not a problem in case of KFileItem, because application/x-desktop is not an alias.<br />This makes KFileItem::iconName() about 4x times faster on first use.<br />It messes with kdecore so I would like to get second opinion on this patch.<br /><br /> Another possible optimization: for each item, KFileItemDelegate checks a
ctual size of file icon. Is this really necessary? Or maybe it would be enough to check size for first icon in the view and then reuse it.</p></body></html>
--Boundary-00=_ac3XJpUTdCe7A+P--
--Boundary-00=_ac3XJl4bEfAR+cr
Content-Type: text/x-patch;
charset="utf-8";
name="kfileitem2.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="kfileitem2.patch"
Index: kio/kio/kfileitem.cpp
===================================================================
--- kio/kio/kfileitem.cpp (wersja 902836)
+++ kio/kio/kfileitem.cpp (kopia robocza)
@@ -673,7 +673,7 @@
KUrl url = mostLocalUrl(isLocalUrl);
KMimeType::Ptr mime = mimeTypePtr();
- if (isLocalUrl && mime->is("application/x-desktop")) {
+ if (isLocalUrl && mime->is("application/x-desktop", KMimeType::DontResolveAlias)) {
KDesktopFile cfg( url.path() );
QString comment = cfg.desktopGroup().readEntry( "Comment" );
if (!comment.isEmpty())
@@ -739,7 +739,7 @@
KUrl url = mostLocalUrl(isLocalUrl);
KMimeType::Ptr mime = mimeTypePtr();
- if (isLocalUrl && mime->is("application/x-desktop")) {
+ if (isLocalUrl && mime->is("application/x-desktop", KMimeType::DontResolveAlias)) {
d->m_iconName = iconFromDesktopFile(url.path());
if (!d->m_iconName.isEmpty()) {
d->m_useIconNameCache = d->m_bMimeTypeKnown;
@@ -938,7 +938,7 @@
if ( !d->m_bIsLocalUrl )
return false;
- if ( mimetype() == "application/x-desktop")
+ if ( mimetype() == "application/x-desktop", KMimeType::DontResolveAlias)
return true;
// Executable, shell script ... ?
@@ -1396,6 +1396,6 @@
return false;
// return true if desktop file
- return determineMimeType()->is("application/x-desktop");
+ return determineMimeType()->is("application/x-desktop", KMimeType::DontResolveAlias);
}
Index: kdecore/services/kmimetype.cpp
===================================================================
--- kdecore/services/kmimetype.cpp (wersja 902836)
+++ kdecore/services/kmimetype.cpp (kopia robocza)
@@ -597,9 +597,9 @@
return QString();
}
-bool KMimeTypePrivate::inherits(KMimeType::Ptr mime) const
+bool KMimeTypePrivate::inherits(const QString& mime) const
{
- if (mime && m_strName == mime->d_func()->m_strName) {
+ if (m_strName == mime) {
return true;
}
foreach( const QString& parent, parentMimeTypes() ) {
@@ -612,15 +612,23 @@
return false;
}
-bool KMimeType::is( const QString& mimeTypeName ) const
+bool KMimeType::is( const QString& mimeTypeName, FindByNameOption options ) const
{
Q_D(const KMimeType);
if (name() == mimeTypeName)
return true;
- KMimeType::Ptr mime = KMimeTypeFactory::self()->findMimeTypeByName(mimeTypeName, KMimeType::ResolveAliases);
- return d->inherits(mime);
+ if (options == ResolveAliases) {
+ KMimeType::Ptr mime = KMimeTypeFactory::self()->findMimeTypeByName(mimeTypeName, KMimeType::ResolveAliases);
+ return mime ? d->inherits(mime->d_func()->m_strName) : false;
+ } else
+ return d->inherits(mimeTypeName);
}
+bool KMimeType::is( const QString& mimeTypeName ) const
+{
+ return is(mimeTypeName, ResolveAliases);
+}
+
QStringList KMimeType::parentMimeTypes() const
{
Q_D(const KMimeType);
Index: kdecore/services/kmimetype_p.h
===================================================================
--- kdecore/services/kmimetype_p.h (wersja 902836)
+++ kdecore/services/kmimetype_p.h (kopia robocza)
@@ -49,7 +49,7 @@
return icon;
}
- bool inherits(KMimeType::Ptr mime) const;
+ bool inherits(const QString& mime) const;
QString fallbackParent() const;
QStringList parentMimeTypes() const;
void collectParentMimeTypes(QStringList&) const;
Index: kdecore/services/kmimetype.h
===================================================================
--- kdecore/services/kmimetype.h (wersja 902836)
+++ kdecore/services/kmimetype.h (kopia robocza)
@@ -328,8 +328,14 @@
* Do not use name()=="somename" anymore, to check for a given mimetype.
* For mimetype inheritance to work, use is("somename") instead.
* Warning, do not use inherits(), that's the servicetype inheritance concept!
- * is() also supports mimetype aliases.
+ * Disabling support for aliases makes this function much faster.
+ * @since 4.2
*/
+ bool is( const QString& mimeTypeName, FindByNameOption options ) const;
+
+ /**
+ * Works like is(mimeTypeName, ResolveAliases)
+ */
bool is( const QString& mimeTypeName ) const;
/**
Index: kdecore/tests/kmimetypetest.cpp
===================================================================
--- kdecore/tests/kmimetypetest.cpp (wersja 902836)
+++ kdecore/tests/kmimetypetest.cpp (kopia robocza)
@@ -514,6 +514,10 @@
QSKIP("kdelibs not installed", SkipAll);
QVERIFY(mrml->is("text/plain"));
QVERIFY(mrml->is("application/octet-stream"));
+
+ const KMimeType::Ptr svg=KMimeType::mimeType("image/svg+xml");
+ QVERIFY(svg->is("text/xml"));
+ QVERIFY(!svg->is("text/xml",KMimeType::DontResolveAlias));
}
// Helper method for all the trader tests
--Boundary-00=_ac3XJl4bEfAR+cr
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Kde-optimize mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-optimize
--Boundary-00=_ac3XJl4bEfAR+cr--