Scheme 中是不是有与 Lisp 的“运行时”原语等价的东西?
Posted
技术标签:
【中文标题】Scheme 中是不是有与 Lisp 的“运行时”原语等价的东西?【英文标题】:Is there an equivalent to Lisp's "runtime" primitive in Scheme?Scheme 中是否有与 Lisp 的“运行时”原语等价的东西? 【发布时间】:2011-01-12 19:10:43 【问题描述】:根据SICP section 1.2.6,练习1.22:
大多数 Lisp 实现都包含一个称为 runtime 的原语,它返回一个整数,该整数指定系统运行的时间量(例如,以微秒为单位)。
我正在使用DrScheme,运行时似乎不可用,所以我正在寻找一个好的替代品。我在 PLT-Scheme Reference 中发现有一个 current-milliseconds 原语。有谁知道Scheme中是否有分辨率更好的计时器?
【问题讨论】:
我刚刚遇到了这个问题 :) 有趣的是,我正在使用 Bill the Lizard 的博客来检查我的答案,因为我正在经历 SICP 4 年后。蜥蜴先生,当你问这个问题时,你看到这个了吗? 这里有一个在racket
中工作的替代timed-prime-test
的要点:gist.github.com/Isaac-Kleinman/1b623bc2463b241b4383
【参考方案1】:
current-milliseconds
是一个从系统返回当前毫秒计数的函数,但它可能会减少。 current-inexact-milliseconds
类似,但返回一个保证增加的浮点数。
您还可以在该页面上找到许多类似的功能,但是如果您只需要对某个功能进行计时,则只需使用 (time
expr) 即可打印出计算表达式所花费的时间。
与此相关的另一件事是profiler,以防您需要对代码进行更详细的分析。
【讨论】:
错了。首先,SICP 和PLT 之间没有直接关系。其次,毫秒计数器来自操作系统,并且由于中断处理程序是在几毫秒级别处理的,因此更精细的计数器没有意义。粒度通常在~20ms,甚至不是1ms。如果你有某种语言,例如,纳秒计数器,你不会得到更好的结果。第三,在毫秒级别测量运行时间是一个坏主意,您需要重复评估足够多次才能获得可观的计数,否则运行时间将在噪音中丢失。 它是current-milliseconds
,而不是current-millisecond
。我尝试编辑答案,但在编辑中至少需要 6 个字符。【参考方案2】:
我今天也遇到了这个问题。我正在使用 DrRacket,因为它似乎已经取代了 DrScheme。虽然这是一个旧线程,但我将为偶然发现此线程的任何新人添加我的发现。
以 R5RS (#lang r5rs
) 为选定语言,在程序前添加以下两行使其工作
(#%require (only racket/base current-milliseconds))
(define (runtime) (current-milliseconds))
【讨论】:
你能说出确切的#lang ...
字符串吗? #lang R5RS
不起作用。
好的,我只是在本书代码的不完整if
中添加了一个“else”分支,以便它在#lang racket
中运行。
@Zelphir:我通常只是从左下角选择“R5RS”作为 DrRacket 中的语言。那时它对我有用。
是#lang r5rs
。【参考方案3】:
我正在使用 mit-scheme 进行 SICP,发现毫秒是由 (real-time-clock)
根据 user manual 给出的。
【讨论】:
【参考方案4】:你可以使用包sicp那个contains定义runtime
。
Here is 包说明。
还有here is的安装说明:
打开包管理器:在 DrRacket 中选择菜单 File 然后选择 Package Manager...。
在标签按我的意思行事找到文本字段并输入:sicp
最后点击安装按钮。
现在您可以从 SICP 拨打runtime
和其他程序:
#lang sicp
(runtime)
预期的输出是这样的:
1606611898030115
>
【讨论】:
以上是关于Scheme 中是不是有与 Lisp 的“运行时”原语等价的东西?的主要内容,如果未能解决你的问题,请参考以下文章