[prev in list] [next in list] [prev in thread] [next in thread]
List: kmail-devel
Subject: Re: for kmail people: a discussion of mail summary files
From: Don Sanders <don () sanders ! org>
Date: 2000-05-16 6:08:15
[Download RAW message or body]
On Tue, 16 May 2000, Waldo Bastian wrote:
> On Mon, 15 May 2000, Don Sanders wrote:
> > Something that takes up a lot of time in KMail when
> > showing a list of message headers (if not taiking up the most time) is the
> > cost of operator new. A KMMsgInfo object and a QListViewItem object has to
> > be constructed for each message header in the list. This means a lot of
> > calls to operator new which is very slow. I tried to speed this up by
> > recycling QListViewItems instead of deleting them and creating new ones
> > this helped a lot but I never really finished this work.
>
> Do you use KMMsgInfo::init() ?? I just noticed that the QString arguments
> misses a "&". E.g. it is "const QString subject" instead of "const QString
> &subject". Changing that spares a call to the QString-copy operator.
>
> (They are missing at other places as well I see...)
I wouldn't think it makes much of a difference since QString is shared
(reference counted).
> Something else you might consider is to use a bucket-allocator as replacement
> for new: You basically allocate a large array of non-initialized KMMsgInfo
> objects and make a linked-list from the ones you don't use. This allows you
> to allocate memory for new KMMsgInfo objects quite fast. Of course the actual
> allocation is only part of the time spent by new, the other time is spent in
> the constructors of the various objects inside it.
Yes, yes, this is what I was talking about, it's called the "Flyweight" pattern
in "Design Patterns". It does speed things up a lot, I made a half-hearted
attempt to do it for KMHeaderItems (derived from QListViewItem) in
kmheaders.cpp.
Actually you might as well throw away the array and just use the linked
list. For a further improvement keep a count of the number of items on
the linked list and
while (number-of-items-on-linked-list + number-of-items shown is greater than
say 5000) {
delete items from the list.
stopping when list is empty
}
> It makes only sense if you have a large number of the same objects.
yes we do, both for KMMsgInfo and KMHeaderItem.
some comments from kmheaders.cpp
<quote>
// About 60% of the time spent in populating the list view in spent
// in operator new and QListViewItem::QListViewItem. Reseting an item
// instead of new'ing takes only about 1/3 as long. Hence this attempt
// reuse list view items when possibly.
//
<cut>
// We can gain some speed by reusing QListViewItems hence
// avoiding expensive calls to operator new and the QListViewItem
// constructor
//
// We should really do this by takeItems out of the QListView and
// store them in a list, and then resuse them from that list as
// needed
//
// The following is a bit of a cludge to achieve a similar end
// (when moving a folder to another folder with around the same
// number of items) but it does unspeakable things if nested
// messages is turned on.
</quote>
If nested messages are turned on you must take all the children of an item
before taking its parent otherwise KMail will crash.
BFN,
Don.
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic