作为一名 Linux 管理员,我过去常常用 Bash、TCL 编写脚本,很少用 Perl 编写脚本。出于好奇,我尝试在 mzscheme 中写一些东西,但我发现性能差很多。我将脚本剪切为简单地读取 500MB 的日志文件:

#lang scheme
(require rnrs/programs-6)
(call-with-input-file (vector-ref (current-command-line-arguments) 0)
    (lambda (in)
            (let loop ((line (read-line in)))
                    (unless (eof-object? line)
                            (loop (read-line in))))))

这个简单的过程大约需要 40 秒。相同的脚本,适用于 Guile,在 10 秒内执行。 TCL 版运行 5 秒。 Chicken Scheme仅需3.8秒,比MZScheme少十倍:
#!/usr/bin/csi -script
(call-with-input-file (list-ref (command-line-arguments) 0)
    (lambda (in)
            (let loop ((line (read-line in)))
                    (if (not (eof-object? line))
                            (loop (read-line in))))))

我究竟做错了什么?有没有关于编写更快的 MZScheme 程序的建议?

还有一些测试:
minaev@minaev:~/1$ time ./t.tcl blog.log

real    0m8.907s
user    0m8.417s
sys     0m0.468s
Mon Oct 31 13:15:19 MSK 2011
minaev@minaev:~/1$ time ./t.scm blog.log # Chicken 4.2.0

real    0m7.678s
user    0m6.896s
sys     0m0.580s
Mon Oct 31 13:15:29 MSK 2011
minaev@minaev:~/1$ time /usr/bin/mzscheme t.ss blog.log # mzscheme 4.2.1

real    0m44.047s
user    0m41.803s
sys     0m0.948s
Mon Oct 31 13:17:03 MSK 2011
minaev@minaev:~/1$ time racket t.ss blog.log  # racket 5.1.3

real    0m25.287s
user    0m23.189s
sys     0m0.828s
Mon Oct 31 13:17:39 MSK 2011
minaev@minaev:~/1$ raco make t.ss
Mon Oct 31 13:17:47 MSK 2011
minaev@minaev:~/1$ time racket t.ss blog.log  # racket 5.1.3 byte-compiled

real    0m23.237s
user    0m22.469s
sys     0m0.688s

最佳答案

这在 Racket 的开发版本中得到了实质性的改进。查看提交 here 和来自 Racket 维护者 Matthew Flatt here 的消息。它现在应该只比鸡慢 50%。其余的减速主要是由于 Racket 提供的附加功能,例如事件、行计数、Unicode 编码等。

关于performance - mzscheme 中的 I/O 性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7946745/

10-10 23:18