( )⚙ D12089 encoding: fix trim() to be O(n) instead of O(n^2)

This is an archive of the discontinued Mercurial Phabricator instance.

encoding: fix trim() to be O(n) instead of O(n^2)
ClosedPublic

Authored by martinvonz on Jan 26 2022, 1:29 PM.

Details

Summary

encoding.trim() iterated over the possible lengths smaller than the
input and created a slice for each. It then calculated the column
width of the result, which is of course O(n), so the overall algorithm
was O(n). This patch rewrites it to iterate over the unicode
characters, keeping track of the length so far. Also, the old
algorithm started from the end of the string, which made it much worse
when the input is large and the limit is small (such as the typical 72
we pass to it).

You can time it by running something like this:

time python3 -c 'from mercurial.utils import stringutil; print(stringutil.ellipsis(b"0123456789" * 1000, 5))'

That drops from 4.05 s to 83 ms with this patch (and most of that is
of course startup time).

Diff Detail

Repository
rHG Mercurial
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

martinvonz created this revision.Jan 26 2022, 1:29 PM
This revision was not accepted when it landed; it landed in state Needs Review.
This revision was automatically updated to reflect the committed changes.