[Issue 12991] New: Possible performance optimization for std.range binary search

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Jun 25 07:00:37 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=12991

          Issue ID: 12991
           Summary: Possible performance optimization for std.range binary
                    search
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: Phobos
          Assignee: nobody at puremagic.com
          Reporter: bearophile_hugs at eml.cc

In std.range there is a binary search for SortedRange:


// Assuming a predicate "test" that returns 0 for a left portion
// of the range and then 1 for the rest, returns the index at
// which the first 1 appears. Used internally by the search routines.
private size_t getTransitionIndex(SearchPolicy sp, alias test, V)(V v)
if (sp == SearchPolicy.binarySearch && isRandomAccessRange!Range)
{
    size_t first = 0, count = _input.length;
    while (count > 0)
    {
        immutable step = count / 2, it = first + step;
        if (!test(_input[it], v))
        {
            first = it + 1;
            count -= step + 1;
        }
        else
        {
            count = step;
        }
    }
    return first;
}


Binary search isn't very cache-friendly, so perhaps inside the binary search
it's a good idea to switch to a linear search when the search interval is small
enough. Where "small enough" means few cache lines long (assuming cache lines
of 64 bytes. So you need T.sizeof to know how many items of type T this
interval is).

--


More information about the Digitalmars-d-bugs mailing list