From: Sage Weil Date: Sat, 2 Sep 2017 02:06:36 +0000 (-0500) Subject: Merge pull request #17088 from zmedico/interval_set_intersection_of_optimization X-Git-Tag: v13.0.1~1071 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f9eca1fafa687f1cb3393ef57ad32c23afa9293a;p=ceph.git Merge pull request #17088 from zmedico/interval_set_intersection_of_optimization interval_set: optimize intersection_of Reviewed-by: Kefu Chai --- f9eca1fafa687f1cb3393ef57ad32c23afa9293a diff --cc src/include/interval_set.h index e05eacae41ef,8b309db8470a..5578c1ccc5d5 --- a/src/include/interval_set.h +++ b/src/include/interval_set.h @@@ -461,10 -515,32 +515,33 @@@ class interval_set assert(&b != this); clear(); + const interval_set *s, *l; + + if (a.size() < b.size()) { + s = &a; + l = &b; + } else { + s = &b; + l = &a; + } + + if (!s->size()) + return; + + /* + * Use the lower_bound algorithm for larger size ratios + * where it performs better, but not for smaller size + * ratios where sequential search performs better. + */ + if (l->size() / s->size() >= 10) { + intersection_size_asym(*s, *l); + return; + } + typename std::map::const_iterator pa = a.m.begin(); typename std::map::const_iterator pb = b.m.begin(); - + typename decltype(m)::iterator mi = m.begin(); + while (pa != a.m.end() && pb != b.m.end()) { // passing? if (pa->first + pa->second <= pb->first)