Skip to content

Works so slow when I try to paste long string to terminal #513

@haoranpb

Description

@haoranpb

I am just using main highlighter. At first, I thought if I just disable some styles, it will work fine. So I disabled all quoted-argument.

When I paste magnet:?xt=..t.nz after " into the terminal:

aria2c "magnet:?xt=urn:btih:90...er.fastcast.nz"

The highlight is gone, but it's still really slow!
I really love the highlighting, how can I make it faster?

Activity

phy1729

phy1729 commented on Apr 5, 2018

@phy1729
Member

(Related to #240.)

Being slow with large inputs is a known issue. There seems to be two main causes:

  1. Iteration over a string is quadratic.
  2. Array appends are quadratic.

I've briefly looked at solving the first in zsh, but I haven't had time to make a complete patch.

With regards to disabling styles, setting a style to none doesn't disable the code that parses for that style. We could add a flag to disable _zsh_highlight_main_highlighter_highlight_argument, but that would disable

  • single-hyphen-option
  • double-hyphen-option
  • history-expansion (sometimes)
  • globbing
  • path (and related styles)
  • single-quoted-argument (and -unclosed)
  • rc-quote
  • double-quoted-argument (and -unclosed)
  • dollar-double-quoted-argument
  • back-double-quoted-argument
  • dollar-quoted-argument (and -unclosed)
  • back-dollar-quoted-argument
  • back-quoted-argument (and -unclosed)

and once #512 is merged the highlighting of command and process substitution and their contents.

If that's acceptable, you can add return 0 as the first command in _zsh_highlight_main_highlighter_highlight_argument. We could add a flag to do the same, but I think long term it'd be preferable to fix the quadratic issues in zsh.

haoranpb

haoranpb commented on Apr 6, 2018

@haoranpb
Author

Thx a lot!

I didn't really find a func named _zsh_highlight_main_highlighter_highlight_argument, but I think you mean add return 0 in front of line 652 in main-highlighter.zsh

It did work a little faster

Tip in #86 is a good idea, I think I will just disable highlighting when I have a very large input

phy1729

phy1729 commented on Apr 6, 2018

@phy1729
Member

Ah forgot the current release doesn't have that function. Where you added it will do similar, but may mess up the state in some cases. Don't think there's a single line change that'd work in the current release.

There's also the possibility to replace some loops with an while i=$arg[(ib:... style loop as in https://github.com/phy1729/zsh-syntax-highlighting/tree/ib-subscript . Haven't had much chance to test it, but I think it improved some cases and worsened others. It would be helpful to have a performance test suite to more rigorously test each change.

haoranpb

haoranpb commented on Apr 6, 2018

@haoranpb
Author

I viewed #86 and some of the source code again, came up with a temporary solution:

Add export ZSH_HIGHLIGHT_MAXLENGTH=60 in file .zshrc

Now it will just stop parse or highlight any long string, and this works well for me.

Thanks for your help!!

danielshahaf

danielshahaf commented on Apr 6, 2018

@danielshahaf
Member

@phy1729 Do you recall that make perf exists? I realise it has room for improvement.

Shall we open separate tickets for the two "X is quadratic" issues you identify?

phy1729

phy1729 commented on Apr 6, 2018

@phy1729
Member

The issue with make perf is that it reuses the test suite data which is probably not reflective of a user's typical buffer. The performance for single quoted, double quoted, and non-quoted strings are all different. Depending on what mix is typical code changes may be performance gains or losses. E.g. changing the bracket highlighter's loop to
while pos=$BUFFER[(ib:pos+1:)[\{\}\(\)\[\]]]; (( pos <= buflen )); do
was faster if every third character or fewer was a bracket but slower if every character is a bracket (an unlikely case). For the main highlighter the change made it slower to highlight the master version of main-highlighter.zsh. I don't know if that result has any bearing on a typical user's experience.

Array appends are quadratic are discussed in #388. We could open an issue for string iteration being quadratic.

Yriuns

Yriuns commented on Dec 8, 2018

@Yriuns

I encounter the similar issue when I copy curl command with long headers. I wonder if it is possible to disable the zsh-syntac-highlighting for specific prefix (like curl)?

danielshahaf

danielshahaf commented on Dec 8, 2018

@danielshahaf
Member

I'd recommend just using ZSH_HIGHLIGHT_MAXLENGTH as @ludanxer suggested. Alternatively, you could patch that part of z-sy-h's source to do something like if [[ $PREBUFFER == *curl* || $BUFFER == *curl* ]]; then return; fi.

Yriuns

Yriuns commented on Dec 8, 2018

@Yriuns

Thanks I lot. I think I will use the former one.

flakrat

flakrat commented on Jun 13, 2019

@flakrat

Thanks for sharing the ZSH_HIGHLIGHT_MAXLENGTH variable. Pasting blocks of script to the terminal was so slow I was about to disable the plugin.

19 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @phy1729@flakrat@chenshengzhi@danielshahaf@forresthopkinsa

        Issue actions

          Works so slow when I try to paste long string to terminal · Issue #513 · zsh-users/zsh-syntax-highlighting