On Wednesday, 14 May 2014 at 14:54:57 UTC, David Nadlinger wrote:
On Wednesday, 14 May 2014 at 14:24:28 UTC, Damian Day wrote:
I've written some search functions, which are many times faster, is it
worth making a pull request?

Generally, we strive to make the algorithms in Phobos as fast as possible even in the general case. I didn't look at the issue at hand in any detail, but if the "-O -release -inline" performance when operating on Arrays is considerably worse than when directly operating on the data, we have a problem, as it likely to also impact other ranges.

In short, I don't think the best solution is to add this special case to Array!T, but rather to figure out what exactly is wrong with Array!T and/or find() and fix the problem at its source. Could you post a short benchmark snippet explicitly showing the problem?

Best,
David

"One" of the issue is the cost of repeatedly indexing Array, when internally it is nothing more than an array. Adding a special case "in" Array.Range allows bypassing the repeated indexing costs, but at the very least, should be implemented "in terms of" find itself, eg:

Range searchForward(E)(E needle)
    if (isImplicitlyConvertible!(E, T))
{
    assert(_outer._data.refCountedStore.isInitialized);

    auto haystack = _outer._data._payload[_a .. _b];
    haystack = haystack.find(needle);
    return Range(this._outer, _b - haystack.length, _b);
}

Reply via email to