Вот наблюдение:
Использование версии integers-starting-from-stream
, которая печатает числа по мере их генерации:
(define (integers-starting-from-stream n)
(stream-cons n
(begin
(display (~a n " "))
(integers-starting-from-stream (+ n 1)))))
И аналогично:
(define (integers-starting-from n)
(s-cons n
(begin (display (~a n " "))
(integers-starting-from (+ n 1)))))
Мы можем проверить с помощью:
(collect-garbage) (collect-garbage) (collect-garbage)
(time (stream-limit (sieve x) 10))
(collect-garbage) (collect-garbage) (collect-garbage)
(time (s-limit (s-sieve s-x) 10))
Мы видим, что потоковая версия печатает числа от 2 до 51, где в s-версии печатаются числа от 2 до 30.
список, создаваемый версией потока, имеет почти двойной размер.
Это первая (и самая важная) причина, по которой версия потока медленнее, чем пользовательская версия.
Вторая причина версии потокамедленнее, то, что потоковая версия кэширует результат stream-first
.Кэширование, как правило, будет быстрее, когда вычисление элемента будет медленным.
(define (integers-starting-from-stream n)
(stream-cons (begin (sleep 1) n)
(integers-starting-from-stream (+ n 1))))
и
(define (integers-starting-from n)
(s-cons (begin (sleep 1) n)
(integers-starting-from (+ n 1))))
И затем выполните:
(collect-garbage) (collect-garbage) (collect-garbage)
(define x (integers-starting-from-stream 2))
(time (stream-limit x 10))
(time (stream-limit x 10))
(collect-garbage) (collect-garbage) (collect-garbage)
(define s-x (integers-starting-from 2))
(time (s-limit s-x 10))
(time (s-limit s-x 10))