From tom@@@k@||ber@ @end|ng |rom gm@||@com  Thu Feb 28 14:53:44 2019
From: tom@@@k@||ber@ @end|ng |rom gm@||@com (Tomas Kalibera)
Date: Thu, 28 Feb 2019 14:53:44 +0100
Subject: [Rd] 
 Bug: time complexity of substring is quadratic as string size
 and number of substrings increases
In-Reply-To: <290ca417-27ce-dd84-277e-9bf5f6d45782@gmail.com>
References: <CALK03d1s36OCLD2Q=7frbL32jzUzhsEsLMHyH9tEqRB+dnrzGw@mail.gmail.com>
 <CALK03d1oR9u_WraZFAhRTrnWHMfYgJ0APgitGnp4ywok1kBOcg@mail.gmail.com>
 <290ca417-27ce-dd84-277e-9bf5f6d45782@gmail.com>
Message-ID: <f33b3cd2-9b2c-1014-1661-445a75c4f516@gmail.com>

An optimized version of substring/substr is now in R-devel (76172).

Best,
Tomas

On 2/22/19 8:16 PM, Tomas Kalibera wrote:
> On 2/20/19 7:55 PM, Toby Hocking wrote:
>> Update: I have observed that stringi::stri_sub is linear time 
>> complexity,
>> and it computes the same thing as base::substring. figure
>> https://github.com/tdhock/namedCapture-article/blob/master/figure-substring-bug.png 
>>
>> source:
>> https://github.com/tdhock/namedCapture-article/blob/master/figure-substring-bug.R 
>>
>>
>> To me this is a clear indication of a bug in substring, but again it 
>> would
>> be nice to have some feedback/confirmation before posting on bugzilla.
>>
>> Also this suggests a fix -- just need to copy whatever 
>> stringi::stri_sub is
>> doing.
>
> Thanks for the report, I am working on a patch that will address this.
>
> I confirm there is a lot of potential for speedup. On my system,
>
> 'N=200000; x <- substring(paste(rep("A", N), collapse=""), 1:N, 1:N)'
>
> spends 96% time in checking if the string is ascii and 3% in strlen(); 
> if we take advantage of the pre-computed value in the ASCII bit, the 
> speed up is about 40x. Of course, with micro-benchmarks, any 
> performance limitation can be arbitrarily inflated, users cannot 
> expect to see these or any close speedups in applications as a result 
> of the patch. The patch is going to do other easy optimizations that 
> will not complicate the code, including avoiding the strlen() call 
> (taking advantage of pre-computed length of R character object).
>
> Best
> Tomas
>
>>
>>
>>
>> On Wed, Feb 20, 2019 at 11:16 AM Toby Hocking <tdhock5 at gmail.com> wrote:
>>
>>> Hi all, (and especially hi to Tomas Kalibera who accepted my patch sent
>>> yesterday)
>>>
>>> I believe that I have found another bug, this time in the substring
>>> function. The use case that I am concerned with is when there is a 
>>> single
>>> (character scalar) text/subject, and many substrings to extract. For 
>>> example
>>>
>>> substring("AAAA", 1:4, 1:4)
>>>
>>> or more generally,
>>>
>>> N=1000
>>> substring(paste(rep("A", N), collapse=""), 1:N, 1:N)
>>>
>>> The problem I observe is that the time complexity is quadratic in N, as
>>> shown on this figure
>>> https://github.com/tdhock/namedCapture-article/blob/master/figure-substring-bug.png 
>>>
>>> source:
>>> https://github.com/tdhock/namedCapture-article/blob/master/figure-substring-bug.R 
>>>
>>>
>>> I expected the time complexity to be linear in N.
>>>
>>> The example above may seem contrived/trivial, but it is indeed 
>>> relevant to
>>> a number of packages (rex, rematch2, namedCapture) which provide 
>>> functions
>>> that use gregexpr and then substring to extract the text in the 
>>> captured
>>> sub-patterns. The figure
>>> https://github.com/tdhock/namedCapture-article/blob/master/figure-trackDb-pkgs.png 
>>>
>>> shows the issue: these packages have quadratic time complexity, whereas
>>> other packages (and the gregexpr function with perl=TRUE after 
>>> applying the
>>> patch discussed yesterday) have linear time complexity. I believe the
>>> problem is the substring function. Source for this figure:
>>> https://github.com/tdhock/namedCapture-article/blob/master/figure-trackDb-pkgs.R 
>>>
>>>
>>> I suspect that a fix can be accomplished by optimizing the 
>>> implementation
>>> of substring, for the special case when the text/subject is a single
>>> element (character scalar). Right now I notice that the substring R 
>>> code
>>> uses rep_len so that the text/subject which is passed to the C code 
>>> is a
>>> character vector with the same length as the number of substrings to
>>> extract. Maybe the C code is calling strlen for each of these 
>>> (identical)
>>> text/subject elements?
>>>
>>> Anyway, it would be useful to have some feedback to make sure this is
>>> indeed a bug before I post on bugzilla. (btw thanks Martin for 
>>> signing me
>>> up for an account)
>>>
>>> Toby
>>>
>> ????[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



[Rd] Bug: time complexity of substring is quadratic as string size and number of substrings increases
Tomas Kalibera