Нужно ли делать что-то особенное, чтобы использовать clojure.core / time? - PullRequest
4 голосов
/ 08 декабря 2011

Я звоню clojure.core / time, который задокументирован как «Оценивает expr и печатает время, которое потребовалось. Возвращает значение expr»

Например:

(time (expensive))

Макрорасширениеон показывает, что он хранит значение в виде let, поэтому после вывода времени он должен немедленно вернуться со значением в выражении let.

Однако, когда я выполняю вызов с дорогими вычислениями, я вижу задержку изатем верните время назад, но затем придется ждать значительного времени (иногда +10 секунд или более), чтобы появился результат.

Может кто-нибудь объяснить, что здесь происходит?

PS: Это использует clojure 1.3.0, если это что-то меняет.

1 Ответ

6 голосов
/ 08 декабря 2011

Может быть, вы возвращаете что-то ленивое, элементы которого создаются только при подаче в REPL?В этом случае вы можете захотеть обернуть его в dorun, который заставляет производить все элементы.

Если бы вы могли предоставить подробную информацию о ваших дорогостоящих вычислениях, мы могли бы убедиться, что это правда.

Полезное дополнение из комментария Саванни Д'Геринеля:

Правильный синтаксис: (time (doall (computation))), если вы хотите вернуть результат, и (time (dorun (computation))), если вы этого не сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...