Производительность ввода / вывода в mzscheme - PullRequest
4 голосов
/ 30 октября 2011

Будучи администратором Linux, я писал свои скрипты на Bash, TCL и реже на Perl.Просто из любопытства я попытался написать что-то в mzscheme, но я обнаружил, что производительность была намного хуже.Я сократил сценарий до простого чтения файла журнала размером 500 МБ:

#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 секунд.Цыпленок Схема занимает всего 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

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Это было существенно улучшено в версии Racket для разработчиков. Смотрите коммит здесь и сообщение от сопровождающего Ракетки Мэтью Флатта здесь . Теперь он должен быть только примерно на 50% медленнее, чем курица. Оставшееся замедление связано, прежде всего, с дополнительными функциями, которые предоставляет Racket, такими как события, счетчик строк, кодировка Unicode и другие.

1 голос
/ 30 октября 2011

Я попытался повторить ваши результаты, и я получил около 3,4 с для Chicken 4.5.0 и около 10 с для различных версий mzscheme / racket. (Я пробовал mzscheme из PLT Scheme 4.2 и ракетку из Racket 5.1.1 и дерева разработки, все скомпилировано в 64-битном режиме.)

Какую версию mzscheme вы используете? Какая платформа?

Ваши тайминги повторяются? (Интересно об эффектах блочного кэша.)

...