Re: Add caching to a few commonly used functions

Zac Medico <[email protected]>
Newsgroups gmane.linux.gentoo.portage.devel
Message-ID <[email protected]>
On 6/27/20 8:12 PM, Michał Górny wrote:
> Dnia June 28, 2020 3:00:00 AM UTC, Zac Medico <[email protected]> napisał(a):
>> On 6/26/20 11:34 PM, Chun-Yu Shei wrote:
>>> Hi,
>>>
>>> I was recently interested in whether portage could be speed up, since
>>> dependency resolution can sometimes take a while on slower machines.
>>> After generating some flame graphs with cProfile and vmprof, I found
>> 3
>>> functions which seem to be called extremely frequently with the same
>>> arguments: catpkgsplit, use_reduce, and match_from_list.  In the
>> first
>>> two cases, it was simple to cache the results in dicts, while
>>> match_from_list was a bit trickier, since it seems to be a
>> requirement
>>> that it return actual entries from the input "candidate_list".  I
>> also
>>> ran into some test failures if I did the caching after the
>>> mydep.unevaluated_atom.use and mydep.repo checks towards the end of
>> the
>>> function, so the caching is only done up to just before that point.
>>>
>>> The catpkgsplit change seems to definitely be safe, and I'm pretty
>> sure
>>> the use_reduce one is too, since anything that could possibly change
>> the
>>> result is hashed.  I'm a bit less certain about the match_from_list
>> one,
>>> although all tests are passing.
>>>
>>> With all 3 patches together, "emerge -uDvpU --with-bdeps=y @world"
>>> speeds up from 43.53 seconds to 30.96 sec -- a 40.6% speedup. 
>> "emerge
>>> -ep @world" is just a tiny bit faster, going from 18.69 to 18.22 sec
>>> (2.5% improvement).  Since the upgrade case is far more common, this
>>> would really help in daily use, and it shaves about 30 seconds off
>>> the time you have to wait to get to the [Yes/No] prompt (from ~90s to
>>> 60s) on my old Sandy Bridge laptop when performing normal upgrades.
>>>
>>> Hopefully, at least some of these patches can be incorporated, and
>> please
>>> let me know if any changes are necessary.
>>>
>>> Thanks,
>>> Chun-Yu
>>
>> Using global variables for caches like these causes a form of memory
>> leak for use cases involving long-running processes that need to work
>> with many different repositories (and perhaps multiple versions of
>> those
>> repositories).
>>
>> There are at least a couple of different strategies that we can use to
>> avoid this form of memory leak:
>>
>> 1) Limit the scope of the caches so that they have some sort of garbage
>> collection life cycle. For example, it would be natural for the
>> depgraph
>> class to have a local cache of use_reduce results, so that the cache
>> can
>> be garbage collected along with the depgraph.
>>
>> 2) Eliminate redundant calls. For example, redundant calls to
>> catpkgslit
>> can be avoided by constructing more _pkg_str instances, since
>> catpkgsplit is able to return early when its argument happens to be a
>> _pkg_str instance.
> 
> I think the weak stuff from the standard library might also be helpful.
> 
> --
> Best regards, 
> Michał Górny
> 

Hmm, maybe weak global caches are an option?
-- 
Thanks,
Zac
signature.asc (application/pgp-signature, 981 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQKTBAEBCgB9FiEE8OgXaltWzqgSupCu0HX7jBBKPSAFAl74EalfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEYw
RTgxNzZBNUI1NkNFQTgxMkJBOTBBRUQwNzVGQjhDMTA0QTNEMjAACgkQ0HX7jBBK
PSBGlQ/8DYj65du9g/PvzjIIpHpkgrY5nKjse5oj7IzPcv8Vmu9oqOqn/uxDAv08
QnXEsgX9x0ZeLAaUSh6s4xNQbq/luBz1jXiV8VwayHxjf6KnAKsQLPWI4BFFxNOH
1GbcVC4iJg3TGhcww7gnpS7xEyfPPrO7RCZUWEXR3dl+R5ld48PzT496/hZxF8px
gIg/IHuh4nZ3z+MrZ+xqWvcKCT9CQtjB4+pS5qf/dytDtUhFHJhqK7+OHmSVrQ6r
fxM5G3JPKuIVkv89M2MhlQfvQAhLDnFxImD5Tm3Uis4oPd9PwUWlApHXsyoRVl0c
h+VXfy9dGxCoIV5Qfdhi6kb89eb+sJgcgVnlMUCCJgjc92+k7eY3bYylhODQk840
KT/xKLKblK1LdUXeWI/gYAbGoixZ71JwnKjL2TOAmayfaelpUOTRY72n6c9NmU8f
ULSVJ521gbH+VXx0T9irC9SLO+250OKBmCIgxS5EHkpCN5irix2AprMKt0DYuuBf
NBE18BIoERMyNWmMEr7NQ+jr0QbmgaKlKXT4SZNtBsJq6tDj16OAjTsWzUUSfa3k
p/nX6lFtoJXHtovR2nXru/R9zLdJargW3s2MY5mTSi0+R2ZQv8P91XA3PGguUKIG
kwj7TbsS3wzWqT5k92BLfJGBI/bsPS8m40K0eNYZnFxW6CcUsCM=
=wXSu
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.