Well, the title says “Enum.succ and Enum.pred are O(n)” and the issue is still
there, so this ticket is definitely not resolved. If anything, it was rejected.

However, the reasoning for keeping O(n) kinda contradicts itself. If we're
trading RAM for performance, and the amount of elements in enums is small, it
shouldn't really matter which way we go. However, as mentioned on the PR
already, .succ-ing repeatedly gives us O(n²), and it's a good idea to avoid
that.

Looking at https://github.com/rakudo/rakudo/commit/55aa7f28d3 , I'm kinda
appreciating the point about premature optimization. However, 8.4x speedup does
not resolve the issue with algorithmic complexity of O(n²) in user code.

As for how huge an enum can be, here are some examples from the ecosystem
(these are just the ones that jumped at me, there are probably more):
*
https://github.com/azawawi/perl6-net-curl/blob/6058c370112a2477b71608ee273231cde1d8f4ae/lib/Net/Curl/NativeCall.pm6#L250-L457
*
https://github.com/perl6/DBIish/blob/2059b722fd2efea25513eb7250ddfe4d1b42ec41/lib/DBDish/Pg/Native.pm6#L152-L308
*
https://github.com/andydude/p6-c-parser/blob/d1deface417808b66b6d57c04e35a801d537dbae/lib/C/AST/Ops.pm6#L4-L90
*
https://github.com/CurtTilmes/perl6-libcurl/blob/95f975fd4ac69c4a561de86dd03e03958e9983c9/lib/LibCurl/EasyHandle.pm6#L98-L189

Sure, not in thousands, but very fucking close.


On 2017-09-15 08:04:30, c...@zoffix.com wrote:
> On Thu, 14 Sep 2017 18:03:16 -0700, alex.jakime...@gmail.com wrote:
> > Actually, another direct implication of using .first is this:
> >
> > Code:
> > enum Animal (Cat => 0, Dog => 0, Human => 42);
> > say Dog.succ
> >
> > Result:
> > Dog
> >
> >
> > So it's not just the algorithmic complexity, and we need a test for
> > that.
> >
> > On 2017-09-14 17:47:59, alex.jakime...@gmail.com wrote:
> > > Source code:
> > > https://github.com/rakudo/rakudo/blob/nom/src/core/Enumeration.pm#L36-
> > > L45
> > >
> > > The problem is with this line:
> > > my $index = @values.first( self, :k );
> > >
> > > Basically, .first will iterate through the elements, but I guess it
> > > is
> > > possible to store the index of the current enum value and simply
> > > increment/decrement it when needed.
> > >
> > > Some discussion here:
> > > https://github.com/rakudo/rakudo/pull/1156#issuecomment-329640201
> > >
> > > I think this ticket is closable without tests once the change is
> > > implemented.
>
>
> The wrong Enumeration:D being returned is now fixed[^1][^2] and
> tested[^3].
>
> For the performance issue: I made[^4] .pred 8.4x faster and .succ 6x
> faster, while keeping the same O(). I hope that's sufficient
> compromise to close this ticket, given that the huge majority of
> Enumerations would have just a few elements, not thousands.
>
> [1] https://github.com/rakudo/rakudo/commit/69dae1f3be
> [2] https://github.com/rakudo/rakudo/commit/8d938461a9
> [3] https://github.com/perl6/roast/commit/dfbbd70d46
> [4] https://github.com/rakudo/rakudo/commit/55aa7f28d3

Reply via email to