From: Amisha Chhajed Date: Sun, 18 Jan 2026 13:07:38 GMT Subject: Re: [PATCH] sparse-checkout: optimize string_list construction Message-ID: In-Reply-To: On Sat, 17 Jan 2026 at 00:41, Junio C Hamano wrote: > > amisha writes: > > > Subject: Re: [PATCH] sparse-checkout: optimize string_list construction > > It would have been nice to see [PATCH v2] or whatever that signals > that there is an earlier iteration. > > > From: Amisha Chhajed > > > > Improve O(n^2) complexity to O(n log n) while building a sorted > > 'string_list' by constructing it unsorted then sorting it > > followed by removing duplicates. > > By the way, do we have t/perf/ that substanticates the performance > claim here (in other words, how much improvement are we expecting in > practice)? After running different perf tests i was not able to find any substantial improvement in the results output before and after this patch, after going through some perf tests i came to conclude that for the results of this commit to shine we need a perf test that tests it with many duplicates, thanks to inputs by Derrick for further confirming this and giving me a starting point. > Also, have you found out why the previous round that did not remove > duplicates saw no failed tests? Perhaps it is a good idea to add > some test that would notice if we failed to add calls to > remove_duplicates in this patch? Yes!, actually we don't have a test that covers the line which removes duplicates. I wrote a test locally which fails if duplicates are found in the output with duplicates in input, very similar to what Jeff wrote for reproducing. I will create a patch sh > This is an unrelated tangent, a possible #leftoverbits material, but > should not be part of this patch (or even in the same series as this > patch). I notice that string_list_remove_duplicates() almost always > immediately follow a call to string_list_sort() of the same > instance, which makes me wonder if we would be better off if we had > a variant of string_list_sort(), and call it string_list_sort_u() After running command git grep -n -e "string_list_sort" -e "string_list_remove_duplicates" -- clone.c fast-export.c fetch.c help.c pack-objects.c sparse-checkout.c from builtin/ i got the output clone.c:1139: string_list_sort(&option_recurse_submodules); clone.c:1140: string_list_remove_duplicates(&option_recurse_submodules, 0); fast-export.c:1121: string_list_sort(&extra_refs); fast-export.c:1122: string_list_remove_duplicates(&extra_refs, 0); fetch.c:1370: string_list_sort(&refnames); fetch.c:2587: string_list_remove_duplicates(&list, 0); help.c:159: string_list_sort(&keys); help.c:199: string_list_remove_duplicates(&keys_uniq, 0); pack-objects.c:3852: string_list_sort(&include_packs); pack-objects.c:3853: string_list_remove_duplicates(&include_packs, 0); pack-objects.c:3854: string_list_sort(&exclude_packs); pack-objects.c:3855: string_list_remove_duplicates(&exclude_packs, 0); pack-objects.c:3899: * string_list_item's ->util pointer, which string_list_sort() does not pack-objects.c:4141: string_list_sort(&discard_packs); pack-objects.c:4142: string_list_sort(&fresh_packs); sparse-checkout.c:97: string_list_sort(&sl); sparse-checkout.c:98: string_list_remove_duplicates(&sl, 0); sparse-checkout.c:296: string_list_sort(&sl); sparse-checkout.c:297: string_list_remove_duplicates(&sl, 0); sparse-checkout.c:320: string_list_sort(&sl); sparse-checkout.c:321: string_list_remove_duplicates(&sl, 0); There are many places where string_list_rmeove_duplicates is directly next to string_list_sort, so it is a very common pattern Thank you.