summaryrefslogtreecommitdiff
path: root/Lisp/performance-hacks.lisp
blob: ba691538131ba18aa9ae386219cc4543982a0f3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
;;;; Objective-CL, an Objective-C bridge for Common Lisp.
;;;; Copyright (C) 2007  Matthias Andreas Benkard.
;;;;
;;;; This program is free software: you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public License
;;;; as published by the Free Software Foundation, either version 3 of
;;;; the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful, but
;;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;;; Lesser General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU Lesser General Public
;;;; License along with this program.  If not, see
;;;; <http://www.gnu.org/licenses/>.

(in-package #:mulk.objective-cl)

;;; This file is for hacks that we might not want to actually use in a
;;; production environment but which might be useful in determining
;;; performance bottlenecks.  These hacks may depend on specific
;;; versions of third-party libraries such as CFFI.


;;; The following hack depends on a specific CFFI snapshot.  It tries to
;;; alleviate the apparent slowness of CFFI::PARSE-TYPE in that
;;; particular snapshot.
;;;
;;; The performance improvement for method calls accomplished by this
;;; hack amounts to approximately 80 % for PRIMITIVE-INVOKE and
;;; approximately 50 % for INVOKE.
#+(or)
(progn
  (defparameter *cffi-hacked* nil)
  (eval-when (:load-toplevel)
    ;; If we do this more than once, we cache our own cached function,
    ;; which is kind of useless.
    (unless *cffi-hacked*
      (setq *cffi-hacked* t)
      (let ((original-cffi-parse-type-fn (fdefinition 'cffi::parse-type)))
        (define-cached-function cffi::parse-type (type)
            type
          (funcall original-cffi-parse-type-fn type))))))