[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-readline] Pasting long lines is slow
From: |
Ole Laursen |
Subject: |
Re: [Bug-readline] Pasting long lines is slow |
Date: |
Wed, 27 May 2015 11:26:23 +0200 |
2015-05-26 22:43 GMT+02:00 Chet Ramey <address@hidden>:
> I did a couple of things. I added an inline _rl_wcwidth function that
> returns 1 for all printable ASCII characters and calls the system wcwidth
> for the rest. That should help, though it doesn't do anything for
> characters between 128 and 256.
>
> The second thing is this experimental patch to text.c that uses the
> heuristic you suggested: it assumes that a call to rl_insert will be
> followed by other calls to rl_insert and tries to read ahead in the
> input stream as long as the character read maps to self-insert. I've
> attached that for folks to experiment with.
I tested it with "åååå " x 50000 (so 250k characters, but perhaps 450k
bytes) and it takes about a second now compared to several minutes
before. Awesome! Thanks!
I probably hit the slowdown weekly at the moment, pasting long SQL
queries into Postgres.
Here's a profile, just for reference:
23,38% fileman fileman [.] _rl_find_prev_mbchar
5,47% fileman libc-2.19.so [.] __gconv_transform_utf8_internal
4,91% fileman [kernel.kallsyms] [k] memset
4,15% fileman [kernel.kallsyms] [k] do_select
3,47% fileman [kernel.kallsyms] [k] _raw_spin_lock_irqsave
3,25% fileman [kernel.kallsyms] [k] sysenter_past_esp
3,01% fileman [kernel.kallsyms] [k] __copy_from_user_ll
2,69% fileman [kernel.kallsyms] [k] __copy_to_user_ll
2,38% fileman [kernel.kallsyms] [k] core_sys_select
2,15% fileman [kernel.kallsyms] [k] n_tty_read
2,07% fileman [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
1,99% fileman fileman [.] _rl_input_available
1,94% fileman libc-2.19.so [.] __mbrtowc
1,55% fileman libc-2.19.so [.] wcwidth
1,39% fileman [kernel.kallsyms] [k] ldsem_down_read
1,26% fileman [kernel.kallsyms] [k] copy_from_read_buf
1,16% fileman [kernel.kallsyms] [k] enqueue_task_fair
1,15% fileman fileman [.] rl_insert_text
With your fix, if I'm not mistaken, readline is now calling wcwidth
and friends 250,000 times compared to around 250000^2 / 2 ~
31,250,000,000 times previously.
Ole