Ignore:
Timestamp:
11/17/16 19:22:56 (7 years ago)
Author:
Mark Evenson
Message:

precompiler: possibly beta reduce form with function position lambda (Alan Ruttenberg)

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

---
<> rdfs:seeAlso <https://mailman.common-lisp.net/pipermail/armedbear-devel/2016-October/003726.html>
<> rdfs:seeAlso <https://mailman.common-lisp.net/pipermail/armedbear-devel/2016-November/003733.html> .
<> :fixes <https://mailman.common-lisp.net/pipermail/armedbear-devel/2016-November/003736.html> .
<> :closes <https://github.com/armedbear/abcl/pull/11/files> .
<> :closes <http://abcl.org/trac/ticket/420> .

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/contrib/jss/invoke.lisp

    r14910 r14911  
    126126(defvar *muffle-warnings* t)
    127127
     128(defvar *muffle-warnings* t)
     129
    128130(defvar *imports-resolved-classes* (make-hash-table :test 'equalp))
    129131
     
    289291      (loop while (hasmore entries)
    290292         for name =  (getname (next entries))
    291          with class-pattern = (#"compile" '|java.util.regex.Pattern| ".*\\.class$")
    292          with name-pattern = (#"compile" '|java.util.regex.Pattern| ".*?([^.]*)$")
     293         with class-pattern = (jstatic "compile" "java.util.regex.Pattern" ".*\\.class$")
     294         with name-pattern = (jstatic "compile" "java.util.regex.Pattern" ".*?([^.]*)$")
    293295         when (matches (matcher class-pattern name))
    294296         collect
Note: See TracChangeset for help on using the changeset viewer.