如何使SBCL优化消除对FDEFINITION的可能调用?

问题描述 投票:0回答:3

抱歉:我没有足够的知识来将其作为易于理解的代码段进行重做。

我一直在使用SBCL编译器注释作为可能改进之处的标志,但是我对此很不了解–

; compiling (DEFUN EXECUTE-PARALLEL ...)
; file: /home/dunham/8000-benchmarksgame/bench/spectralnorm/spectralnorm.sbcl-8.sbcl
; in: DEFUN EXECUTE-PARALLEL
;     (FUNCALL FUNCTION START END)
; --> SB-C::%FUNCALL THE 
; ==>
;   (SB-KERNEL:%COERCE-CALLABLE-FOR-CALL FUNCTION)
; 
; note: unable to
;   optimize away possible call to FDEFINITION at runtime
; because:
;   FUNCTION is not known to be a function

#+sb-thread
(defun execute-parallel (start end function)
  (declare (type int31 start end))
  (let* ((num-threads 4))
    (loop with step = (truncate (- end start) num-threads)
          for index from start below end by step
          collecting (let ((start index)
                           (end (min end (+ index step))))
                       (sb-thread:make-thread
                        (lambda () (funcall function start end))))
          into threads
          finally (mapcar #'sb-thread:join-thread threads))))

#-sb-thread
(defun execute-parallel (start end function )
  (funcall function start end))

(程序为here。类似程序的测量值为here。]

使SBCL“优化对FDEFINITION的可能调用是可行的,还是编译器是在说明而不是机会?”>

抱歉:我没有足够的知识来将其作为易于理解的代码段进行重做。我一直在使用SBCL编译器注释作为可能需要改进的标志,但我对...

optimization lisp common-lisp sbcl
3个回答
2
投票

可能调用fdefinition的原因是,它不知道function是一个函数:它可能是一个函数的名称:通常,它可能是函数指定符


2
投票

在真实代码中,请避免这样的优化-除非确实需要


0
投票

您问有关删除定义的问题,但实际上,您的问题是基于这样一个前提,即sbcl注释是推动优化和改进的好方法。这些注释是发现明显问题和类型声明可以帮助的地方的好方法。他们没有告诉您什么实际上使您的程序变慢。改善程序性能的正确方法是:1.考虑是否有更快的算法,然后2.测量其性能并找出慢的方法。

单个定义调用仅在紧密循环中发生(即它不是单个而是非常复数)才有意义”

在这种情况下,它恰好启动了一个线程。如果要在紧密循环中启动线程,那么性能问题将来自在紧密循环中启动线程。不要那样做。

© www.soinside.com 2019 - 2024. All rights reserved.