[Lazarus] unit Masks vs. unit FPMasks

José Mejuto joshyfun at gmail.com
Wed Feb 24 12:05:27 CET 2021


El 24/02/2021 a las 11:47, Bart via lazarus escribió:
> On Wed, Feb 24, 2021 at 10:02 AM Bart <bartjunk64 at gmail.com> wrote:
> 
>> Of course that is NOT a reason not to improve it: O(n^4) is just terrible.
> 
> To put this discussion in a little perspective.
> Given a string S (UTF8 encoded) with Utf8Length=1000.
> GetCodePoint(S,1000) on my laptop takes 0.00439 msecs to perform.
> So 10 thousand of these lookups cost appr. 44 ms.
> This is kind of a worst case scenario.
> You are not very likely to have strings that long in TMask.MatchesMask
> (and certainly not in a MaskEdit).

Hello,

The worst case scenario is not based in GetCodePoint time, is in the 
TMask logic when "*" is found, it enters in recursive scan from that 
point, if it founds a new "*" it recurses again and if it finally fails 
in comparison it rolls back to the first "*". So specially crafted masks 
makes it recurse a lot.

String:='This is a test string';
Mask:='*T*h*s*n*x';

Of course this is not a day by day use ;-)

Note: Just to put in context, my "explore" in the TMask world started 
when writing my NTFS filesystem reader, when all file names are read 
(400,000) I can search for them using masks. When compiled in fpc 
(Lazarus) the "*.txx" search takes 1-2 seconds (not measured) and when 
compiled with Delphi it takes +/- 0.3 seconds, so I stated to write my 
own TMask.


-- 



More information about the lazarus mailing list