Re: Generalized-Arrays egg v1.0.1

Jeremy Steward <[email protected]>
Newsgroups gmane.lisp.scheme.chicken
Organization ThatGeoGuy
Message-ID <[email protected]>
On 2/3/24 16:03, John Cowan wrote:
> 
> 
> On Sat, Feb 3, 2024 at 5:39 PM Jeremy Steward <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>       Likewise, I opt to use (chicken fixnum) but this is
>     because I discovered that SRFI-143 is so egregiously slower than
>     (chicken fixnum) that it was causing serious performance regressions in
>     many of the array APIs.
> 
> 
> That's very odd. The Chicken-specific library wrapper for SRFI 143 at 
> GitHub (srfi-143.scm, which needs to be updated to Chicken 5) makes use 
> of Chicken's native fx* procedures.  I don't know how the Chicken (srfi 
> 143) egg was built, though; it may be using rubber-chicken.scm and 
> fxcore.scm, which are slow emulations meant for complete portability.

 From what I understand on the SRFI page it is in fact re-exporting 
these procedures and not handling the overflow / underflow of some of 
the operations.

There's this note on overflow on the docs page:

<https://wiki.call-cc.org/eggref/5/srfi-143#note-on-overflow>

Differences from the intended implementation details aside, I think the 
core of what was a performance hazard (at least as far as I looked into 
it) could have been one of two things (maybe both?):

1. The egg itself is not compiled with -O3, whereas if I link to 
(chicken fixnum) I believe that these procedures will be inlined by the 
CHICKEN compiler when the arrays egg is compiled with -O3 or higher.

2. There may be some rewriting rules that the compiler uses for 
procedures in the (chicken ...) namespace that optimizes these directly 
into their equivalent optimized C procedures. I'm not sure the compiler 
has the same visibility if you re-export these from behind a module, and 
especially not if you link dynamically (any hope of inlining those is 
thus gone forever).

In fact on the latter point above, this raises an interesting question I 
had for the mailing list: if I re-export a CHICKEN-specific procedure, 
does the way the compiler handles translation units prevent certain 
optimizations from applying? I've somewhat noticed that to be the case 
but I haven't seen any writing about it nor have I understood the extent 
to which that might affect certain SRFIs or eggs.

> If you have time/energy, it would be useful to make Chicken's 
> implementation do what it was originally intended.  See the 
> "Implementation" section in the SRFI, or feel free to ask me for 
> explanations of details.

I might have the time/energy for this, so I'll let you know if I stumble 
into anything soon. I think a CHICKEN-specific implementation probably 
wants to use the FFI since fixnums are guaranteed in their representation:

<https://wiki.call-cc.org/man/5/Data%20representation#immediate-objects>

It might also be a good idea to enforce SRFI-143's behaviour around 
overflow / underflow as part of CHICKEN's default behaviour in CHICKEN 
6, but I don't really know how I would get started having that discussion.

In any case, I've cc'd Diego (SRFI-143 maintainer), maybe together we 
can find a way to improve the situation :)

Regards,
-- 
Jeremy Steward
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.