← Back to team overview

gtg-contributors team mailing list archive

Re: Refactorisation progress : It works (but it's slow)

 

Only for performances, could you please take the latest revision (658) of
my refactoring branch and try it with a lot of tasks and confirm me that
I'm not dreaming ?

I just can't believe what I'm seeing but that computer is fast.


Lionel

PS: tags display is still broken.



On Thu, 25 Feb 2010 01:27:16 +0100, Bertrand Rousseau
<bertrand.rousseau@xxxxxxxxx> wrote:
> On Wed, Feb 24, 2010 at 5:57 PM, Lionel Dricot <ploum@xxxxxxxxx> wrote:
>>
>> I've very good news for myself : I see the light.
>>
>> The FilteredTree is now working nearly perfectly. It is rock-solid,
even
>> when loading 300 tasks at the same time. I also implemented the Closed
>> Tasks pane with it. The FiltersBank is also working great.
> 
> Great news!
> 
>> Bad news : with a lot of tasks, the start time is really really really
>> slow. (like 10 times the current trunk launch time). On the other hand,
>> it
>> looks like other performance issues are mostly solved (like renaming a
>> subtask in a task).
> 
> Task renaming is maybe due to the fact that you disabled the refresh
> methods from the browser. Originally, it can from the fact that
> browser refresh is called at each letter you type by the editor. It
> should be worth looking at this too or it will probably show again
> sometime.
> 
>> So now, I need *you*. I need testing and profiling.
>>
>> Do : bzr branch lp:~gtg/gtg/gtg-refactor
>> and launch it first with debugging data then with actual data. Do some
>> profiling ( http://live.gnome.org/gtg/development ) and send me the
>> results.
> 
> Here's mine (on my netbook, so slownesses are sensible here):
> 
>    Ordered by: cumulative time
>    List reduced from 947 to 15 due to restriction <15>
> 
>    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
>         1    0.000    0.000   10.889   10.889
> /home/rousseau/workspace/gtg/gtg-refactor/GTG/gtg.py:91(main)
>         1    0.000    0.000   10.127   10.127
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/manager.py:49(show_browser)
>         1    0.000    0.000    9.047    9.047
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:1795(main)
>         1    4.523    4.523    8.653    8.653 {gtk._gtk.main}
>       244    0.030    0.000    3.011    0.012
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:1642(on_task_modified)
>       244    0.027    0.000    2.595    0.011
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/tagtree.py:53(update_tags_for_task)
>      4032    0.263    0.000    2.457    0.001 {method 'row_changed' of
> 'gtk.TreeModel' objects}
>      7208    0.394    0.000    1.734    0.000 {method 'get_value' of
> 'gtk.TreeModel' objects}
>      7495    0.060    0.000    1.380    0.000
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/tagtree.py:82(on_get_value)
>       732    0.023    0.000    1.347    0.002
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:788(tag_visible_func)
>       879    0.297    0.000    1.295    0.001
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/tagstore.py:305(get_tasks_nbr)
>     12660    0.107    0.000    1.140    0.000
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/requester.py:135(get_task)
>         1    0.000    0.000    1.074    1.074
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:83(__init__)
>     12660    0.231    0.000    1.034    0.000
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/datastore.py:51(get_task)
>      2709    0.175    0.000    0.825    0.000
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:858(tag_sort_func)
> 
> As you can see, a lot of time is spent in update_tags_for_task. If you
> comment this out, get_value and on_task_modified don't even show up in
> the profiling log:
> 
>    Ordered by: cumulative time
>    List reduced from 944 to 15 due to restriction <15>
> 
>    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
>         1    0.000    0.000    9.428    9.428
> /home/rousseau/workspace/gtg/gtg-refactor/GTG/gtg.py:91(main)
>         1    0.000    0.000    8.639    8.639
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/manager.py:49(show_browser)
>         1    0.000    0.000    7.443    7.443
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:1795(main)
>         1    5.892    5.892    7.012    7.012 {gtk._gtk.main}
>         1    0.001    0.001    1.173    1.173
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:83(__init__)
>         1    0.000    0.000    0.776    0.776
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/browser.py:525(_init_plugin_engine)
>         1    0.002    0.002    0.775    0.775
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/plugins/engine.py:147(load_plugins)
>        12    0.002    0.000    0.587    0.049
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/plugins/engine.py:40(__init__)
>        12    0.001    0.000    0.544    0.045
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/plugins/engine.py:108(_load_module)
>        12    0.003    0.000    0.514    0.043 {imp.load_module}
>        29    0.003    0.000    0.442    0.015
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/tools/cleanxml.py:98(savexml)
>         2    0.000    0.000    0.430    0.215
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/core/__init__.py:160(save_datastore)
>        10    0.356    0.036    0.395    0.040 {method 'show' of
> 'gtk.Widget' objects}
>       975    0.064    0.000    0.383    0.000
>
/home/rousseau/workspace/gtg/gtg-refactor/GTG/taskbrowser/tasktree.py:94(on_get_value)
>        29    0.001    0.000    0.334    0.012
> /usr/lib/python2.6/xml/dom/minidom.py:47(toprettyxml)
> 
> It's probably not the task of the browser to refresh each tag related
> to a task. Since Tags have references to their tasks, they are
> modified as well when a Task is edited. So we should probably let the
> tag emit a signal to warn everyone they changed (much like the Task
> are doing now). Let the objets which care about it to register
> themselve to this signal through the requester.
> 
> That would imply having a "on_tag_modified" in the browser that would
> trigger some job to perform on the browser (probably not much since,
> if I understood well, most of the filtering work is now done outside
> the browser)
> 
>> If you want to contribute, there's a huge cleaning to do in the
>> browser.py
>> ! A lot of cruft should be removed (and I don't understand everything
>> there).
> 
> I agree with what you say, but it would be more efficient if you could
> be more specific and point out some of these cruft.
> 
>>
>> What does not work :
>> - tag filtering. They are implemented.  We just need to do
>> "self.req.apply_filter(tagname)" when a particular tag is selected but
I
>> don't know where it is in browser.py and I'm a bit tired. (any help is
>> welcome here)
>> - drag-n-drop : code is commented out in tasktree.py. Maybe it will
work
>> without any trouble.
>> - multiparent (not tested yet)
>> - tag count in tagtree
>>
>> What is broken :
>> - plugins and plugin_api
>> - dbus interface
>>
>>
>> I was expecting better performances but FilteredTree appeared to be a
lot
>> more complex than expected. So now, it's time to optimize it a bit and
>> I'm
>> wondering where is the bottleneck.
> 
> Like I wrote above, it seems to be situated around tags update
> mechanisms and TagTreeModel updates.
> 
>>
>> Thanks for listenning,
>>
>>
>> Lionel
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~gtg-contributors
>> Post to     : gtg-contributors@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~gtg-contributors
>> More help   : https://help.launchpad.net/ListHelp
>>



Follow ups

References