作为一名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