Review Request 113488: Store the selected items in a more efficient way

Commit Hook null at kde.org
Wed Oct 30 22:38:59 GMT 2013


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/113488/#review42721
-----------------------------------------------------------


This review has been submitted with commit 5c5d87fec44e7c5934e4b24060200173153f0ff4 by Frank Reininghaus to branch master.

- Commit Hook


On Oct. 28, 2013, 7:22 p.m., Frank Reininghaus wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/113488/
> -----------------------------------------------------------
> 
> (Updated Oct. 28, 2013, 7:22 p.m.)
> 
> 
> Review request for Dolphin.
> 
> 
> Repository: kde-baseapps
> 
> 
> Description
> -------
> 
> We currently store the selected items in a QSet<int>, which is neither space-efficient nor particularly fast when inserting many items which are in a consecutive range. A good way to see this is to watch Dolphin's memory usage with KSysGuard while pressing Ctrl+A in a really large folder - this can really be considered a bug IMHO.
> 
> I propose to replace the QSet<int> by a new class which I called "KItemSet", and which stores the items in a sorted list of ranges. For each range, we only store the first index and the length of the range, so we need a lot less memory for most common selection patterns, and we also save quite a few CPU cycles in many situations, because adding an item to the KItemSet will in many cases not need a memory allocation at all, and it's particularly easy when inserting sorted items into the KItemSet in a row.
> 
> KItemSet contains a minimal subset of QSet's API which makes it suitable as a drop-in replacement for our needs. I also added iterators, such that the items can be iterated through easily, also with foreach. One advantage of KItemSet compared to QSet<int> is that the items are always iterated through in ascending order.
> 
> Another advantate is that KItemListController::slotRubberBandChanged() can use the symmetric difference of KItemSets to calculate the new selection when doing a rubberband selection with Ctrl pressed, rather than implementing an inefficient workaround for QSet's lack of a symmetric difference function.
> 
> The diff looks fairly large, but except for the new class and the unit test, all changes are straightforward replacements.
> 
> Some more optimizations will be possible, for example, we can simply add a whole range of selected items when pressing Ctrl+A, rather than adding all items one by one. Another area where KItemSet will make it possible to improve the performance is KFileItemModel::createMimeData(). Some of the slowness of this function (which can be seen by pressing Ctrl+A and then Ctrl+C even in a folder of moderate size) is due to the fact that KDirModel::simplifiedUrlList(urls) internally sorts all URLs (which is not necessary because the URLs are sorted automatically now).
> 
> 
> Diffs
> -----
> 
>   dolphin/src/CMakeLists.txt 48ea14c 
>   dolphin/src/kitemviews/kfileitemlistview.h bdc63b0 
>   dolphin/src/kitemviews/kfileitemlistview.cpp 8950c9a 
>   dolphin/src/kitemviews/kfileitemmodel.h d005705 
>   dolphin/src/kitemviews/kfileitemmodel.cpp f21edbf 
>   dolphin/src/kitemviews/kitemlistcontroller.h bb72856 
>   dolphin/src/kitemviews/kitemlistcontroller.cpp befb097 
>   dolphin/src/kitemviews/kitemlistselectionmanager.h c89b8a4 
>   dolphin/src/kitemviews/kitemlistselectionmanager.cpp 833f7aa 
>   dolphin/src/kitemviews/kitemlistview.h 14360b0 
>   dolphin/src/kitemviews/kitemlistview.cpp b3d805a 
>   dolphin/src/kitemviews/kitemlistviewaccessible.cpp 565c215 
>   dolphin/src/kitemviews/kitemmodelbase.h c5b9a0c 
>   dolphin/src/kitemviews/kitemmodelbase.cpp edce95e 
>   dolphin/src/kitemviews/kitemset.h PRE-CREATION 
>   dolphin/src/kitemviews/kitemset.cpp PRE-CREATION 
>   dolphin/src/kitemviews/kstandarditemmodel.h 0debd6a 
>   dolphin/src/kitemviews/kstandarditemmodel.cpp 959d62c 
>   dolphin/src/panels/places/placesitemmodel.h 6938360 
>   dolphin/src/panels/places/placesitemmodel.cpp eae2095 
>   dolphin/src/tests/CMakeLists.txt dd761fc 
>   dolphin/src/tests/kitemlistcontrollertest.cpp 60e93e5 
>   dolphin/src/tests/kitemlistselectionmanagertest.cpp 302985a 
>   dolphin/src/tests/kitemsettest.cpp PRE-CREATION 
>   dolphin/src/views/dolphinview.h a6f969b 
>   dolphin/src/views/dolphinview.cpp fd149e0 
> 
> Diff: http://git.reviewboard.kde.org/r/113488/diff/
> 
> 
> Testing
> -------
> 
> All unit tests work (old+new), and I could not find any regressions when selecting items in different ways.
> 
> 
> Thanks,
> 
> Frank Reininghaus
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.kde.org/mailman/private/kfm-devel/attachments/20131030/efad258a/attachment.htm>


More information about the kfm-devel mailing list