[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Take some lowhanging fruit to speed up R6RS fixnum operation
From: |
Andreas Rottmann |
Subject: |
Re: [PATCH] Take some lowhanging fruit to speed up R6RS fixnum operations |
Date: |
Fri, 25 Mar 2011 00:42:44 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) |
address@hidden (Ludovic Courtès) writes:
> Hi Andreas,
>
> I’m all for your suggestion.
>
> Andreas Rottmann <address@hidden> writes:
>
>> + (define-syntax define-fxop*
>> + (syntax-rules ()
>> + ((_ name op)
>> + (define name
>> + (case-lambda
>> + ((x y)
>> + (assert-fixnum x y)
>> + (op x y))
>> + (args
>> + (assert-fixnums args)
>> + (apply op args)))))))
>> +
>> + (define-fxop* fx=? =)
>
> How about making something like this (untested):
>
> (define-syntax define-fxop*
> (syntax-rules ()
> ((_ name op)
> (define-syntax name
> (lambda (s)
> (syntax-case s ()
> ((_ x y)
> #'(begin
> (assert-fixnum x y)
> (op x y)))
> ((_ args ...)
> #'(apply op args))
> (_ #'op)))))))
>
> This way, there’d be no procedure call involved and ‘=’, ‘+’, etc. would
> use the corresponding instruction in the base case.
>
That's an excellent idea, and would probably boost performance quite a
bit. However, there's still the issue that the non-two-args cases don't
throw the exceptions required by R6RS. Upon trying to interpret the
R6RS in a way that would lift that requirement, I still see no way to do
so in the general case, due to the following quite explicit language:
Fixnum operations perform integer arithmetic on their fixnum
arguments, but raise an exception with condition type
&implementation-restriction if the result is not a fixnum.
So even if checking the arguments seems to be not explicitly required
(but might be implictly intended -- "fixnum arguments"), the result must
definitly be a fixnum, or the mentioned exception be thrown.
So for the sake of efficiency, while heeding what is explictly required,
I propose the following:
- Alias all fixnum operations that yield non-fixnums (e.g. fx<?, fx>?,
...) with the corresponding non-fixnum procedures. IMHO, that seems
to be within bounds wrt. R6RS; Section 5.4 "Argument checking"
says:
The implementation must check that the restrictions in the
specification are indeed met, to the extent that it is reasonable,
possible, and necessary to allow the specified operation to complete
successfully.
One might argue that it is not reasonable (for efficiency reasons
related to the way Guile is currently implemented) and certainly not
necessary to check the arguments for fixnum-ness in these procedures.
- Otherwise, do the macro trick as above, but fall back on a procedure
like in SRFI-9's `define-inlinable' for the non-binary case.
Thoughts?
Regards, Rotty
--
Andreas Rottmann -- <http://rotty.yi.org/>
Re: Take some lowhanging fruit to speed up R6RS fixnum operations, Andy Wingo, 2011/03/29