[Development] updating many QPersistentModelIndices
Milian Wolff
milian.wolff at kdab.com
Wed Jun 3 18:32:46 CEST 2015
Hey all,
for a customer I looked into the performance of a model/view application with
many (and I mean, many!) add/remove/modify operations on a model with a
QSortFilterProxyModel on top. The obvious solution to speed things up is
batching, which works nicely paired with layout{AboutToBe,}Changed. So far so
good, but the issue that was now reported comes when one now *also* wants to
enable MultiSelection in the view, and the user "accidentally" presses
CTRL + A to select all items in the view. This then completely kills the
performance, due to bottlenecks inside QAbstractItemModel, all related to
QPersistentModelIndex.
Some questions now from my side:
a) Why is the hash of indexes in QAbstractItemModelPrivate::Persistent not
unique - i.e. why is insertMulti required? I ask, b/c the "it + 1" operation
in QAbstractItemModelPrivate::Persistent::insertMultiAtEnd is _extremely_ slow
for large lists of persistent model indices, due to the cache misses etc. pp.
involved. The documentation says:
"There should be only one instance QPersistentModelIndexData per index,
but in some intermediate state there may be severals of PersistantModelIndex
pointing to the same index, ..."
What intermediate state is that? When I look at the uses of this function,
they always use the pattern
persistent.indexes.erase(...);
...
persistent.insertMultiAtEnd(...);
I fail to see how/where this intermediate state can occur.
b) Changing that function to just use insert() and returning early, the big
bottleneck above is gone, but it's still very slow, mostly due to the
inefficiencies built-in to QPersistentModelIndex, e.g. operator= required in
the merge sort step. I wonder what to do there...
Has anyone had similar experiences, and if so - what where the workarounds
applied to make this fast?
Thanks
--
Milian Wolff | milian.wolff at kdab.com | Software Engineer
KDAB (Deutschland) GmbH&Co KG, a KDAB Group company
Tel: +49-30-521325470
KDAB - The Qt Experts
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5903 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20150603/b74e8ccc/attachment.bin>
More information about the Development
mailing list