抱歉:我没有足够的知识来将其作为易于理解的代码段进行重做。
我一直在使用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))
使SBCL“优化对FDEFINITION的可能调用是可行的,还是编译器是在说明而不是机会?”>
抱歉:我没有足够的知识来将其作为易于理解的代码段进行重做。我一直在使用SBCL编译器注释作为可能需要改进的标志,但我对...
可能调用fdefinition
的原因是,它不知道function
是一个函数:它可能是一个函数的名称:通常,它可能是函数指定符
在真实代码中,请避免这样的优化-除非确实需要
您问有关删除定义的问题,但实际上,您的问题是基于这样一个前提,即sbcl注释是推动优化和改进的好方法。这些注释是发现明显问题和类型声明可以帮助的地方的好方法。他们没有告诉您什么实际上使您的程序变慢。改善程序性能的正确方法是:1.考虑是否有更快的算法,然后2.测量其性能并找出慢的方法。
单个定义调用仅在紧密循环中发生(即它不是单个而是非常复数)才有意义”
在这种情况下,它恰好启动了一个线程。如果要在紧密循环中启动线程,那么性能问题将来自在紧密循环中启动线程。不要那样做。