Ethereal-dev: [Ethereal-dev] Re: Performance: change the time format for a file with 500 000 f
Jeff Morriss wrote:
Speaking of performance...
Whatever happened to making changing the time format faster? E.g. from
this thread:
http://www.ethereal.com/lists/ethereal-dev/200302/msg00029.html
I ask because I recently had the pleasure of looking at a 170,000 packet
file and wanted to change the time display format--I ended up giving up
after 5 minutes. :(
If it's still not possible to make it very fast, would it be possible to
make the GUI update more frequently while it's doing this? Currently it
seems to update every 3 seconds (which makes clicking "Stop" difficult)...
I started looking into increasing N_PROGBAR_UPDATES when changing the
time display but quickly realized that any change I made didn't have
much affect when the number of packets displayed was large.
A little investigation showed why: it's doing O(N^2) work because it does:
for each packet
packet_list_find_row_from_data()
update the time
where 'packet_list_find_row_from_data()' does a linear search of the
rows and then returns the row number.
The attached patch changes this function to make a (cheap) educated
guess that the caller might be doing a linear update of all the rows--if
so, it short cuts the search. Of course, this helps only when there are
no display filters that have eliminated packets from the display, but
hey... Look at the results when it does help:
On a 2.4 GHz Xeon system, loading my 310,000 packet capture took this
much time (this is for reference only):
real 0m14.379s
user 0m11.920s
sys 0m0.400s
Changing the time display without this patch took:
real 34m13.849s
user 33m58.330s
sys 0m5.400s
With the patch it took:
real 8m56.941s
user 8m45.020s
sys 0m1.550s
Changing the time format is still slow because it's still doing O(N^2) work:
'packet_list_set_text()' is called for each packet with a row
number--which was gotten from the potentially O(N)
'packet_list_find_row_from_data()' above.
This then calls 'gtk_clist_set_text()' which uses the (I believe) O(N)
'ROW_ELEMENT()' to get the pointer to the actual row element again (even
though we just had that value when we were in
'packet_list_find_row_from_data()'). I suspect new versions of
'packet_list_set_text()' and 'gtk_clist_set_text()' which take pointers
to the row elements (making them O(1)) would be a Good Thing, but I'll
have to look at that a bit later...
(I noted a couple of other places that do the same
'packet_list_find_row_from_data()' followed almost immediately by
'gtk_clist_set_text()', so there's probably a lot of room for
improvement here...)
(Maybe all uses of ROW_ELEMENT() should be investigated for possible
improvements?)
Attachment:
gtkclist.patch.gz
Description: GNU Zip compressed data