Провёл тест на скорость работы одной и той же функции, написанной нормально и через ФВП. Получил потерю производительности в полтора раза:
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, если там без них почти ничего написать нельзя (точнее не принято рекомендуемым стилем программирования)?