On Thursday, 27 March 2014 at 16:12:36 UTC, monarch_dodra wrote:
On Thursday, 27 March 2014 at 15:45:14 UTC, Andrei Alexandrescu wrote:
On 3/27/14, 8:44 AM, Steven Schveighoffer wrote:
On Thu, 27 Mar 2014 11:40:59 -0400, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:

On 3/27/14, 5:35 AM, Steven Schveighoffer wrote:
BTW, I think there has been recent talk about not focusing on dust when we are laying bricks. This would have my vote as useless dust. This does not solve the problem of streams-as-ranges, because streams don't make good ranges. It doesn't really solve any problems as far as I can tell.

I think byXchar are important and are not streams. -- Andrei

What's broken about those?

Speed.

I call shenanigans. This is the code:

            @property bool empty()
            {
                if (nLeft)
                    return false;
                if (r.empty)
                    return true;

If you initialized the next element in both constructor and popFront, then you'd get rid of both these checks.


... but of course lose laziness.

Furthermore, popFront() has a guaranteed "1 call" per element. Weareas "empty" and "front" may be called several times in a row for a single element.

If you want efficiency, stop being "member-wise" lazy, and put some eagerness in your code.


Does a flag "isInitialized" even have an effect on performance where it matters?

It should only be relevant in tight loops, and there I expect a moderately well-working optimizer to inline calls to `empty` and `front`. It can then see that it has just set "isInitialized" to true/false, and remove the checks completely, effectively generating code as if the value were only fetched/computed in `empty`. That only leaves the larger struct size as a potential problem. However I've seen LDC being able to "decompose" a struct into separate variables, so I guess it can remove the unnecessary member in our case.

In other situations, where you already have more complex code, an additional conditional branch will not have as much weight anyway.

Does somehow have numbers for realistic programs, with GDC/LDC/DMD? I suspect this entire discussion is moot, because we can easily have non-eagerly initialized ranges without sacrificing performance in most situations.

Reply via email to