Есть ли в Scheme эквивалент примитива времени выполнения Lisp?

Согласно раздел 1.2.6 SICP, упражнение 1.22:

Большинство реализаций Лиспа включают примитив, называемый средой выполнения, который возвращает целое число, указывающее количество времени, в течение которого система работает (измеряется, например, в микросекундах).

Я использую DrScheme, где среда выполнения недоступна, поэтому я ищу хорошую замену. Я обнаружил в справочнике по PLT-схеме, что существует current-milliseconds примитив. Кто-нибудь знает, есть ли в схеме таймер с лучшим разрешением?


person Bill the Lizard    schedule 03.02.2010    source источник
comment
Я как раз столкнулся с этой проблемой :)   -  person Chris Taylor    schedule 08.07.2011
comment
Интересно, что я использую блог Ящера Билла, чтобы проверить свои ответы, поскольку я прохожу через SICP через 4 года после того, как он прошел через него. Вы предвидели это, когда задавали этот вопрос, мистер Ящерица?   -  person Cody Piersall    schedule 31.08.2014
comment
Вот суть с альтернативой timed-prime-test, которая работает в racket: gist.github.com/Isaac-Kleinman/ 1b623bc2463b241b4383   -  person Isaac Kleinman    schedule 18.09.2015


Ответы (4)


_ 1_ - это функция, которая возвращает текущий счетчик миллисекунд из системы, но он может уменьшиться. _ 2_ аналогично, но возвращает гарантированно увеличивающееся число с плавающей запятой.

На этой странице также есть множество похожих функций, но если все, что вам нужно, - это синхронизировать определенную функцию, просто используйте (_ 3_ < em> expr), и он распечатает время, затраченное на оценку выражения.

Еще одна важная вещь - это профилировщик, на случай, если вам понадобится еще подробный анализ вашего кода.

person Eli Barzilay    schedule 03.02.2010
comment
Это неверно. Во-первых, нет прямой связи между SICP и PLT. Во-вторых, счетчик миллисекунд поступает из ОС, и поскольку обработчики прерываний обрабатываются на уровне нескольких миллисекунд, нет смысла в более точном счетчике. Гранулярность обычно составляет ~ 20 мс, даже не 1 мс. Если у вас есть какой-то язык, например, с наносекундным счетчиком, вы не получите лучших результатов. В-третьих, измерение времени выполнения на уровне миллисекунд - плохая идея, вам нужно повторить оценку достаточно раз, чтобы получить существенный счет, иначе время выполнения будет потеряно в шуме. - person Eli Barzilay; 05.02.2010
comment
Это current-milliseconds, а не current-millisecond. Я попытался отредактировать ответ, но SO требует как минимум 6 символов в редактировании. - person bruno nery; 10.11.2011

Я сегодня тоже столкнулся с этой проблемой. Я использую DrRacket, поскольку он заменил DrScheme. Хотя это старая ветка, я добавляю свои выводы для всех, кто впервые наткнется на эту ветку.

Выбрав R5RS (#lang r5rs) в качестве выбранного языка, добавьте следующие две строки перед программой, чтобы она работала.

(#%require (only racket/base current-milliseconds))
(define (runtime) (current-milliseconds))
person patentfox    schedule 17.07.2016
comment
Подскажите, пожалуйста, точную #lang ... строку? #lang R5RS не работает. - person Zelphir Kaltstahl; 19.08.2016
comment
Хорошо, я просто добавил ветвь else к неполному if кода книги, чтобы она работала в #lang racket. - person Zelphir Kaltstahl; 19.08.2016
comment
@Zelphir: Обычно я просто выбираю R5RS снизу слева как язык в DrRacket. Тогда у меня это сработало. - person patentfox; 24.08.2016

Вы можете использовать пакет sicp, который содержит определение runtime.

Вот описание пакета.

И вот инструкции по установке:

  • Откройте диспетчер пакетов: в DrRacket выберите меню Файл, затем выберите Диспетчер пакетов….

  • На вкладке Что я имею в виду найдите текстовое поле и введите: sicp

  • Наконец, нажмите кнопку Установить.

Теперь вы можете вызывать runtime и другие процедуры из SICP:

#lang sicp
(runtime)

Ожидаемый результат будет таким:

1606611898030115
> 
person Mark Shevchenko    schedule 29.11.2020

Я использую mit-схему для выполнения SICP и обнаружил, что миллисекунды задаются (real-time-clock) согласно руководство пользователя.

person mwal    schedule 09.06.2020