Провёл тест на скорость работы одной и той же функции, написанной нормально и через ФВП. Получил потерю производительности в полтора раза:
SBCL:
(declaim (optimize (speed 3) (safety 0)))
(asdf:oos 'asdf:load-op :alexandria)
(defun f (x)
  (+ (+ (+ x 1) 2) 1))
(let ((f-comp
          (alexandria:compose
            (lambda (x) (+ x 1))
            (lambda (x) (+ x 2))
            (lambda (x) (+ x 1)))))
  (defun f-comp (x)
     (funcall f-comp x)))
(defconstant iter 10000000)
(time
 (dotimes (i iter)
   (f i)))
(time
 (dotimes (i iter)
   (f-comp i)))
Evaluation took:
  0.181 seconds of real time
  0.180000 seconds of total run time (0.180000 user, 0.000000 system)
  99.45% CPU
  325,363,554 processor cycles
  0 bytes consed
Evaluation took:
  0.296 seconds of real time
  0.296000 seconds of total run time (0.296000 user, 0.000000 system)
  100.00% CPU
  530,610,480 processor cycles
  0 bytes consed
Racket:
#lang racket
(define (f x)
  (+ (+ (+ x 1) 2) 1))
(define f-comp
  (compose
   (lambda (x) (+ x 1))
   (lambda (x) (+ x 2))
   (lambda (x) (+ x 1))))
(define iter 1000000)
(time 
 (for ([i iter])
   (f i)))
(time 
 (for ([i iter])
   (f-comp i)))
cpu time: 728 real time: 726 gc time: 0
cpu time: 1244 real time: 1244 gc time: 0
Получается, функции высшего порядка лучше не использовать? А как с этим борются в Haskell, если там без них почти ничего написать нельзя (точнее не принято рекомендуемым стилем программирования)?


