Mercurial > public > mercurial-scm > hg
diff mercurial/encoding.py @ 33925:2c37f9dabc32
encoding: add fast path of jsonescape() (issue5533)
This isn't highly optimized as it copies characters one by one, but seems
reasonably simple and not slow.
(with mercurial repo)
$ export HGRCPATH=/dev/null HGPLAIN=
$ hg log --time --config experimental.stabilization=all -Tjson > /dev/null
(original)
time: real 6.830 secs (user 6.740+0.000 sys 0.080+0.000)
time: real 6.690 secs (user 6.650+0.000 sys 0.040+0.000)
time: real 6.700 secs (user 6.640+0.000 sys 0.060+0.000)
(this patch)
time: real 5.630 secs (user 5.550+0.000 sys 0.070+0.000)
time: real 5.700 secs (user 5.650+0.000 sys 0.050+0.000)
time: real 5.690 secs (user 5.640+0.000 sys 0.050+0.000)
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 23 Apr 2017 14:47:52 +0900 |
parents | b9101467d88b |
children | f4433f2713d0 |
line wrap: on
line diff
--- a/mercurial/encoding.py Sun Apr 23 16:10:51 2017 +0900 +++ b/mercurial/encoding.py Sun Apr 23 14:47:52 2017 +0900 @@ -26,7 +26,7 @@ asciilower = charencode.asciilower asciiupper = charencode.asciiupper -_jsonescapeu8fast = charencodepure.jsonescapeu8fast # TODO: no "pure" +_jsonescapeu8fast = charencode.jsonescapeu8fast _sysstr = pycompat.sysstr @@ -404,8 +404,8 @@ 'this is a test' >>> jsonescape('escape characters: \\0 \\x0b \\x7f') 'escape characters: \\\\u0000 \\\\u000b \\\\u007f' - >>> jsonescape('escape characters: \\t \\n \\r \\" \\\\') - 'escape characters: \\\\t \\\\n \\\\r \\\\" \\\\\\\\' + >>> jsonescape('escape characters: \\b \\t \\n \\f \\r \\" \\\\') + 'escape characters: \\\\b \\\\t \\\\n \\\\f \\\\r \\\\" \\\\\\\\' >>> jsonescape('a weird byte: \\xdd') 'a weird byte: \\xed\\xb3\\x9d' >>> jsonescape('utf-8: caf\\xc3\\xa9') @@ -416,6 +416,10 @@ If paranoid, non-ascii and common troublesome characters are also escaped. This is suitable for web output. + >>> s = 'escape characters: \\0 \\x0b \\x7f' + >>> assert jsonescape(s) == jsonescape(s, paranoid=True) + >>> s = 'escape characters: \\b \\t \\n \\f \\r \\" \\\\' + >>> assert jsonescape(s) == jsonescape(s, paranoid=True) >>> jsonescape('escape boundary: \\x7e \\x7f \\xc2\\x80', paranoid=True) 'escape boundary: ~ \\\\u007f \\\\u0080' >>> jsonescape('a weird byte: \\xdd', paranoid=True)