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 的“运行时”原语等价的东西?的主要内容,如果未能解决你的问题,请参考以下文章

[lisp] scheme环境搭建与编译运行

Common Lisp 和 Scheme 词法闭包的区别

Scheme和Clojure没有原子类型谓词 - 这是设计的吗?

Scheme实现数字电路仿真——组合电路

有没有纯函数式的 Scheme 或 Lisp?

Scheme可以在没有Racket的情况下做GUI吗?还是必须使用 Common Lisp?