[TxMt] TM tokenizer is taking 100% CPU for long while using 100-200KB text files with single line
Charilaos Skiadas
cskiadas at gmail.com
Wed Feb 27 15:50:34 UTC 2008
You missed the "line-based" part. This means that each regular
expression must be checked against each entire line. Unless I'm
mistaken, the time taken by any regexp mechanism is going to be much
more than linear in the length of the string, probably exponential in
the worst case. On the other hand, if you test it on strings of fixed
length, it will be linear on the number of strings tested, which is
the second case you described. In other words, when using a line-
based system it takes longer to process a single string, that to
process many strings of small length.
So it is not so much a question of compiling, the timing is very
different because newlines do matter, the parser matches single lines
via regular expressions. The longer the line, the harder it is to
determine if one of the regular expressions matches the whole line or
not.
If the parser was ignoring newlines, it would mean that every regexp
would need to be tested against the entire document every single
moment. This would be an even worse slowdown.
Allan is certainly aware of this slowdown on long lines, it is
definitely in the top 5 complaints. If there was an easy solution,
that doesn't sacrifice on the richness of the highlighting and the
flexibility in user customization of it, it would probably have
already been implemented.
Haris Skiadas
Department of Mathematics and Computer Science
Hanover College
On Feb 27, 2008, at 9:59 AM, Adam Strzelecki wrote:
> Hello,
>
>> But in TextMate the syntax highlighter (and more) is line-based and
>> works with regular expressions and not a precompiled lexer/parser,
>> so,
>> yes, the line length does matter.
>
> I thought length doesn't matter ;)
>
> Anyway I'm not convinced :) I agree that precompiled lexer/parser
> is simply faster, however I don't see the point that regexp
> tokenizer works 1000x slower on file that has single 200'000
> characters line, rather than 20000 x 10 character lines (while both
> files are exactly same size,... ouch, faster one is slightly bigger
> because of extra \n ;P)
>
> I hope TM compiles its regular expressions just once, moreover
> execute single regexp made from merge of all regexp, rather all
> regular expressions separately.
> With this belief and fact that compiled regexp is an automaton
> similar to the one in pre-compiled parsers & lexers, line length
> shouldn't IMHO matter.
> So if it does, there's a place for optimization.
>
> Cheers,
> --
> Adam Strzelecki |: nanoant.com :|
More information about the textmate
mailing list