[armedbear] #420: Add ability to optimize function calls with lambda in function position. Use it to optimize jss

armedbear armedbear-devel at common-lisp.net
Thu Nov 17 09:23:49 UTC 2016


#420: Add ability to optimize function calls with lambda in function position.
Use it to optimize jss
------------------------------+--------------------------
      Reporter:  mevenson     |      Owner:
          Type:  enhancement  |     Status:  new
      Priority:  major        |  Milestone:  1.5.0
     Component:  compiler     |    Version:  1.5.0-dev
    Resolution:               |   Keywords:  github-issue
Parent Tickets:               |
------------------------------+--------------------------
Description changed by mevenson:

Old description:

> Precompiler: When compiling a form with a lambda in the function
> position, possibly optimize it
>
> Case 1: If the lambda has a single form in it, let someone define a
> transform using:
>
> define-function-position-lambda-transform (body-function-name (arglist
> form args) &body body)
>
> body-function-name is the car of the single form in the lambda
> arglist is the arglist of the lambda
> form is the single form within the lambda
> args are the arguments to which the lambda will be defined.
>
> The function should check whether it can do a transform, and do it if
> so, otherwise return nil signalling it couldn't
>
> Case 2: If case 1 is not successful then if the arglist is a simple
> one (no &key, &rest, &optional) then do a standard beta-reduction
> binding the args to arglist using let
> (https://wiki.haskell.org/Beta_reduction)
>
> If not, return and do the usual thing.
>
> An example is in contrib/jss/optimize-java-call.lisp
>
> To see benefits, (compile-file contrib/jss/test-optimize-java-call.lisp)
> and then load the compiled file. You should see something like the below
> which reports the timings for the optimized and unoptimized version of
> 10000 calls of (#"compile" 'regex.pattern ".*")
>
> --
>
> With optimization: (INVOKE-RESTARGS-MACRO "compile" (QUOTE REGEX.PATTERN)
> (LIST ".") NIL T)
> Without optimization: ((LAMBDA (#:G85648 &REST #:G85649) (INVOKE-RESTARGS
> "compile" #:G85648 #:G85649 NIL)) (QUOTE REGEX.PATTERN) ".")
>
> JUST-LOOP
> 0.0 seconds real time
> 0 cons cells
>
> OPTIMIZED-JSS
> 0.011 seconds real time
> 0 cons cells
>
> UNOPTIMIZED-JSS
> 0.325 seconds real time
> 800156 cons cells
>
> See:
> https://mailman.common-lisp.net/pipermail/armedbear-
> devel/2016-October/003726.html
> https://mailman.common-lisp.net/pipermail/armedbear-
> devel/2016-November/003733.html

New description:

 Alan requests in <https://github.com/armedbear/abcl/pull/11>:

 Precompiler: When compiling a form with a lambda in the function
 position, possibly optimize it

 Case 1: If the lambda has a single form in it, let someone define a
 transform using:

 define-function-position-lambda-transform (body-function-name (arglist
 form args) &body body)

 body-function-name is the car of the single form in the lambda
 arglist is the arglist of the lambda
 form is the single form within the lambda
 args are the arguments to which the lambda will be defined.

 The function should check whether it can do a transform, and do it if
 so, otherwise return nil signalling it couldn't

 Case 2: If case 1 is not successful then if the arglist is a simple
 one (no &key, &rest, &optional) then do a standard beta-reduction
 binding the args to arglist using let
 (https://wiki.haskell.org/Beta_reduction)

 If not, return and do the usual thing.

 An example is in contrib/jss/optimize-java-call.lisp

 To see benefits, (compile-file contrib/jss/test-optimize-java-call.lisp)
 and then load the compiled file. You should see something like the below
 which reports the timings for the optimized and unoptimized version of
 10000 calls of (#"compile" 'regex.pattern ".*")

 --

 With optimization: (INVOKE-RESTARGS-MACRO "compile" (QUOTE REGEX.PATTERN)
 (LIST ".") NIL T)
 Without optimization: ((LAMBDA (#:G85648 &REST #:G85649) (INVOKE-RESTARGS
 "compile" #:G85648 #:G85649 NIL)) (QUOTE REGEX.PATTERN) ".")

 JUST-LOOP
 0.0 seconds real time
 0 cons cells

 OPTIMIZED-JSS
 0.011 seconds real time
 0 cons cells

 UNOPTIMIZED-JSS
 0.325 seconds real time
 800156 cons cells

 See:
 https://mailman.common-lisp.net/pipermail/armedbear-
 devel/2016-October/003726.html
 https://mailman.common-lisp.net/pipermail/armedbear-
 devel/2016-November/003733.html

--

--
Ticket URL: <http://abcl.org/trac/ticket/420#comment:1>
armedbear <http://abcl.org>
armedbear


More information about the armedbear-ticket mailing list