LINUX.ORG.RU

Эксперименты с обработкой текста

 ,


1

2
PERCHAR-VS-BUFFERING> (format t "~A-~A~%"
                              (lisp-implementation-type)
                              (lisp-implementation-version))
SBCL-1.3.20
NIL

Код здесь: https://pastebin.com/f6RtgQPE

Заранее извиняюсь за на коленке налабанный говнокод.

Для экспериментов нашёл свою старую курсовую в LaTeX и, редактируя и копипастя, раздул файл до 200M.

Вот результаты экспериментов у меня:

PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (time
                         (with-open-file (*standard-input* #P"text3.tex")
                           (let ((lv (multiple-value-list (run-perchar))))
                             (setf *x* lv)
                             (first lv)))))
Evaluation took:
  4.092 seconds of real time
  4.092759 seconds of total run time (4.042829 user, 0.049930 system)
  100.02% CPU
  9,427,500,968 processor cycles
  7,733,248 bytes consed
  
114337080
PERCHAR-VS-BUFFERING> (defparameter *x2* *x*)
*X2*
PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (time
                         (with-open-file (*standard-input* #P"text3.tex")
                           (let ((lv (multiple-value-list (run-with-buffering))))
                             (setf *x* lv)
                             (first lv)))))
Evaluation took:
  3.162 seconds of real time
  3.162505 seconds of total run time (3.117984 user, 0.044521 system)
  100.03% CPU
  7,284,480,890 processor cycles
  7,765,280 bytes consed
  
114337080
PERCHAR-VS-BUFFERING> (equal *x* *x2*)
T
PERCHAR-VS-BUFFERING> 

Как некоторые могут догадаться экспериментировали с делающими одно и то же программами, но немного разными путями. Задачку выбрал несложную чисто для эксперимента.

От многоуважаемой публики прошу аналитику и замечания по техническим аспектам, а также предложения улучшить эксперимент.

PS для некоторых проверок запускал wc -m. Хотя задача у него гораздо проще чем у реализаций на CL, но что примечательно - он проигрывал в скорости от самой медленной реализации на CL более чем на 800 мс.

PS2 Жирный и тупой троллинг от хомячков т.н. мейнстрима и других д**ов здесь не нужен

★★★★★

... делающими одно и то же программами, но немного разными путями ...

1. В «gather-indexes» есть подозрительное место, так что не факт, что программы дадут одинаковый результат. Ты сравниваешь только размер текста, а списки бекслешей и процентов могут различаться.

2. Чтение из файла - крайне медленная операция.

2.а Зубок писал, что СБЦЛ читает вчетверо медленнее Си (см. посты про аудиоплеер на СБЦЛ)

2.б Год назад делалось сравнение разных ЯП на скорость ввода, могу завтра вечером найти ссылку. Правда там тесты для бинарного файла и дял СБЦЛ не доделали оптимизации.

Поэтому считай свой файл в переменную *text* и оберни вызов (run-perchar) в:

(with-input-from-string (*standard-input* *text*)
  (run-perchar))
т так же для (run-with-buffering)

3. Сформулируй задачу словами и выложи тестовый файл - в пятницу или выходные доберусь до компа где есть лисп.

anonymous
()
Ответ на: комментарий от anonymous

2. Чтение из файла - крайне медленная операция.

, на фоне которой время обработки незначительно.

anonymous
()
Ответ на: комментарий от anonymous

п.3. Собрать позиции с символами отдельно \ и %. Однако символ % открывает зону комментирования которая идёт до конца строки или файла - в ней все символы игнорируются.

ados ★★★★★
() автор топика
Ответ на: комментарий от anonymous

По поводу

Поэтому считай свой файл в переменную *text* и оберни...:

Вот взял файл поменьше:

PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.298 seconds of real time
  0.298328 seconds of total run time (0.296035 user, 0.002293 system)
  100.00% CPU
  687,217,900 processor cycles
  720,896 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.327 seconds of real time
  0.327232 seconds of total run time (0.317765 user, 0.009467 system)
  100.00% CPU
  753,808,200 processor cycles
  720,896 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.288 seconds of real time
  0.288515 seconds of total run time (0.288515 user, 0.000000 system)
  100.35% CPU
  664,661,260 processor cycles
  719,584 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (equal *x* *x2*)
T
PERCHAR-VS-BUFFERING> (defparameter *x2* *x*)
*X2*
PERCHAR-VS-BUFFERING> (let ((*buffer-size* 10394280))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.322 seconds of real time
  0.321346 seconds of total run time (0.312047 user, 0.009299 system)
  99.69% CPU
  740,291,944 processor cycles
  42,298,048 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (let ((*buffer-size* 10394280))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.328 seconds of real time
  0.328358 seconds of total run time (0.315051 user, 0.013307 system)
  [ Run times consist of 0.007 seconds GC time, and 0.322 seconds non-GC time. ]
  100.00% CPU
  756,239,518 processor cycles
  42,298,048 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (let ((*buffer-size* 10394280))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.324 seconds of real time
  0.323289 seconds of total run time (0.317003 user, 0.006286 system)
  99.69% CPU
  744,745,240 processor cycles
  42,265,280 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (let ((*buffer-size* 10394280))
                        (with-open-file (*standard-input* #P"text2.tex")
                          (let ((lv (time (multiple-value-list (run-with-buffering)))))
                            (setf *x* lv)
                            (first lv))))
Evaluation took:
  0.329 seconds of real time
  0.329859 seconds of total run time (0.323318 user, 0.006541 system)
  [ Run times consist of 0.006 seconds GC time, and 0.324 seconds non-GC time. ]
  100.30% CPU
  759,465,954 processor cycles
  42,298,048 bytes consed
  
10394280
PERCHAR-VS-BUFFERING> (equal *x* *x2*)
T
PERCHAR-VS-BUFFERING> 
ados ★★★★★
() автор топика
Ответ на: комментарий от ados

Файл можно в tmpfs поместить. Хотя здесь практически это оно и есть.

ados ★★★★★
() автор топика
Ответ на: комментарий от anonymous
PERCHAR-VS-BUFFERING> (sb-profile:reset)
NIL
PERCHAR-VS-BUFFERING> (let ((*buffer-size* (* 4 (expt 2 10))))
                        (time
                         (with-open-file (*standard-input* #P"text3.tex")
                           (let ((lv (multiple-value-list (run-with-buffering))))
                             (setf *x* lv)
                             (first lv)))))
Evaluation took:
  4.322 seconds of real time
  4.323310 seconds of total run time (3.568209 user, 0.755101 system)
  100.02% CPU
  9,958,165,524 processor cycles
  7,750,880 bytes consed
  
114337080
PERCHAR-VS-BUFFERING> (sb-profile:report)
  seconds  |     gc     | consed |  calls  |  sec/call  |  name  
------------------------------------------------------
     2.017 |      0.000 |      0 | 772,490 |   0.000003 | POSITION
------------------------------------------------------
     2.017 |      0.000 |      0 | 772,490 |            | Total

estimated total profiling overhead: 0.91 seconds
overhead estimation parameters:
  8.000001e-9s/call, 1.1799999e-6s total profiling, 5.02e-7s internal profiling
; No value
ados ★★★★★
() автор топика
Ответ на: комментарий от ados

п1. Мой косяк. Ты прав. Уже засыпал - не заметил.

п3. Понял из run-perchar. Дай файл для экспериментов.

п2. Вечером напишу уточнение.

anonymous
()
Ответ на: комментарий от anonymous

Я не говорю что чтение из файла вообще роли не играет. sb-sprof говорит, что оно почти больше половины времени отжирает. Но как выясняется с этим ничего не сделаешь. А главное то что доля времени даже такой элементарной обработки довольно значительна.

ados ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.