@matheusbsbs / matheus-bagliano / commits / 462749b728
Fork 0

utf8.c: speculatively assume utf-8 in strbuf_add_wrapped_text()

is_utf8() works by calling utf8_width() for each character at the supplied location. In strbuf_add_wrapped_text(), we do that anyway while wrapping the lines. So instead of checking the encoding beforehand, optimistically assume that it's utf-8 and wrap along until an invalid character is hit, and when that happens start over. This pays off if the text consists only of valid utf-8 characters. The following command was run against the Linux kernel repo with git 1.7.0: $ time git log --format='%b' v2.6.32 >/dev/null real 0m2.679s user 0m2.580s sys 0m0.100s $ time git log --format='%w(60,4,8)%b' >/dev/null real 0m4.342s user 0m4.230s sys 0m0.110s And with this patch series: $ time git log --format='%w(60,4,8)%b' >/dev/null real 0m3.741s user 0m3.630s sys 0m0.110s So the cost of wrapping is reduced to 70% in this case. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Feb 19, 2010 at 23:20 UTC 462749b728f72079a67202d4d0d1ef19ef993f61
1 file changed +17 -6
utf8.c
+17 -6
@@ -324,16 +324,21 @@ static size_t display_mode_esc_sequence_len(const char *s)
324 * consumed (and no extra indent is necessary for the first line).
325 */
326 int strbuf_add_wrapped_text(struct strbuf *buf,
327 - const char *text, int indent, int indent2, int width)
327 + const char *text, int indent1, int indent2, int width)
328 {
329 - int w = indent, assume_utf8 = is_utf8(text);
330 - const char *bol = text, *space = NULL;
329 + int indent, w, assume_utf8 = 1;
330 + const char *bol, *space, *start = text;
331 + size_t orig_len = buf->len;
332
333 if (width <= 0) {
333 - strbuf_add_indented_text(buf, text, indent, indent2);
334 + strbuf_add_indented_text(buf, text, indent1, indent2);
335 return 1;
336 }
337
338 +retry:
339 + bol = text;
340 + w = indent = indent1;
341 + space = NULL;
342 if (indent < 0) {
343 w = -indent;
344 space = text;
@@ -385,9 +390,15 @@ new_line:
390 }
391 continue;
392 }
388 - if (assume_utf8)
393 + if (assume_utf8) {
394 w += utf8_width(&text, NULL);
390 - else {
395 + if (!text) {
396 + assume_utf8 = 0;
397 + text = start;
398 + strbuf_setlen(buf, orig_len);
399 + goto retry;
400 + }
401 + } else {
402 w++;
403 text++;
404 }