Добавил профилирование работы ДКА через анализ логов в Guile-SMC:
#dev #guile #lisp #smc
$ smc profile examples/parenthesis-check/out.log
Total transitions: 99
Total time: 20553 us
Stats:
read_state_transition_to: 4690 us (22.8191 %)
read_state_transition_guard: 2355 us (11.4582 %)
read_word: 1597 us (7.7702 %)
read_state_description: 1548 us (7.5317 %)
read: 1404 us (6.8311 %)
read_state_right_arrow: 1049 us (5.1039 %)
search_state_transition: 988 us (4.8071 %)
search_state_transition_to: 977 us (4.7536 %)
read_state_transition_action: 779 us (3.7902 %)
read_start_tag: 699 us (3.4010 %)
search_state_transition_guard: 639 us (3.1090 %)
search_state_transition_action: 223 us (1.0850 %)
search_state_action_arrow: 201 us (.9780 %)
read_state_action_arrow: 192 us (.9342 %)
read_end_tag: 164 us (.7979 %)
read_state: 163 us (.7931 %)
#dev #guile #lisp #smc
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
А вот и первые результаты использования профилировщика — нашёл узкое место в парсере PlantUML и оптимизировал его. Было (коммит fb26247):
Стало (коммит dea3e6d):
Итого ускорение работы парсера на ~25% по моим прикидкам за счёт кэша резольвера процедур на базе хэш-таблицы.
#dev #guile #lisp #smc
$ /usr/bin/smc profile examples/parenthesis-check/out.log
Total transitions: 99
Total time: 20553 us
Stats:
read_state_transition_to: 4690 us (22.8191 %)
read_state_transition_guard: 2355 us (11.4582 %)
read_word: 1597 us (7.7702 %)
read_state_description: 1548 us (7.5317 %)
read: 1404 us (6.8311 %)
read_state_right_arrow: 1049 us (5.1039 %)
search_state_transition: 988 us (4.8071 %)
search_state_transition_to: 977 us (4.7536 %)
read_state_transition_action: 779 us (3.7902 %)
read_start_tag: 699 us (3.4010 %)
search_state_transition_guard: 639 us (3.1090 %)
search_state_transition_action: 223 us (1.0850 %)
search_state_action_arrow: 201 us (.9780 %)
read_state_action_arrow: 192 us (.9342 %)
read_end_tag: 164 us (.7979 %)
read_state: 163 us (.7931 %)
Стало (коммит dea3e6d):
$ /usr/bin/smc profile examples/parenthesis-check/out-3.log
Total transitions: 99
Total time: 14925 us
Stats:
read: 3158 us (21.1591 %)
read_state_transition_guard: 1663 us (11.1424 %)
read_state_transition_to: 1483 us (9.9363 %)
read_word: 1259 us (8.4355 %)
read_state_description: 1014 us (6.7940 %)
read_state_right_arrow: 839 us (5.6214 %)
search_state_transition_to: 670 us (4.4891 %)
search_state_transition: 638 us (4.2747 %)
read_state_transition_action: 536 us (3.5913 %)
read_start_tag: 535 us (3.5846 %)
search_state_transition_guard: 428 us (2.8677 %)
read_state: 178 us (1.1926 %)
search_state_transition_action: 139 us (.9313 %)
read_state_action_arrow: 139 us (.9313 %)
search_state_action_arrow: 132 us (.8844 %)
read_end_tag: 125 us (.8375 %)
Итого ускорение работы парсера на ~25% по моим прикидкам за счёт кэша резольвера процедур на базе хэш-таблицы.
#dev #guile #lisp #smc
GitHub
smc/cli/command-profile (command-profile): Improve · artyom-poptsov/guile-smc@fb26247
* modules/smc/cli/command-profile.scm (command-profile): Improve output
formatting.
formatting.
Guile-Udev обновился до версии 0.2.3 в GNU Guix:
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=3c86268004fce434c71c27c4ee84152de087ad22
#guile #udev #guix #dev
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=3c86268004fce434c71c27c4ee84152de087ad22
#guile #udev #guix #dev
В коммитах на
При копировании в модулях происходит замена зависимостей так, чтобы они все указывали на скопированные модули. Например, было:
#guile #smc #dev #lisp #fsm
master в Guile-SMC добавил standalone-режим для компилятора машин состояний, теперь все необходимые модули копируются в отдельный каталог.$ treeДалее выполняем компиляцию в standalone-режиме:
.
├── context.scm
├── fsm.puml
├── main.scm
└── README.org
0 directories, 5 files
$ cat fsm.puml | /usr/bin/smc compile -L . -U "((context))" -m "(custom-fsm)" \Содержимое каталога теперь выглядит так:
-t guile-standalone --debug > custom-fsm.scm
$ treeОбратите внимание, что появился каталог с именем модуля, в котором указано расположить целевой ДКА — "custom-fsm". В этот каталог были скопированы модули Guile-SMC, необходимые для работы целевого ДКА, плюс зависимости из списка дополнительных модулей (
.
├── context.scm
├── custom-fsm
│ ├── context.scm
│ └── smc
│ ├── context
│ │ ├── char-context.scm
│ │ └── context.scm
│ ├── core
│ │ ├── common.scm
│ │ ├── log.scm
│ │ ├── stack.scm
│ │ ├── state.scm
│ │ └── transition.scm
│ └── fsm.scm
├── custom-fsm.scm
├── fsm.puml
├── main.scm
└── README.org
4 directories, 14 files
-U "((context))").При копировании в модулях происходит замена зависимостей так, чтобы они все указывали на скопированные модули. Например, было:
$ head -4 context.scmСтало:
(define-module (context)
#:use-module (oop goops)
#:use-module (ice-9 textual-ports)
#:use-module (smc context char-context)
$ head -4 custom-fsm/context.scmТакой автомат можно запускать без наличия Guile-SMC в системе.
(define-module (custom-fsm context)
#:use-module (oop goops)
#:use-module (ice-9 textual-ports)
#:use-module (custom-fsm smc context char-context)
#guile #smc #dev #lisp #fsm
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
Пример профилирования ДКА в Guile-INI 0.3.0 через Guile-SMC профилировщик.
Тестовая программа:
Тестовая программа:
$ cat test.scmЗапуск парсера с выводом лога в файл:
#!/usr/bin/guile-3.0 \
-L modules -e main -s
!#
(use-modules (ice-9 pretty-print)
(oop goops)
(logging logger)
(smc core log)
(ini))
(define (main args)
(log-clear-handlers!)
(log-add-handler! (make <port-log/us>
#:port (open-output-file "ini.log")))
(let ((data (ini->scm (current-input-port) #:debug-mode? #t)))
(pretty-print data)
(scm->ini data)))
$ cat /etc/php/7.4/apache2/php.ini | ./test.scmЛог:
$ wc ini.logСобственно профилирование:
3528 21168 280750 ini.log
$ head ini.log
2022-01-07 17:06:27.338353 (DEBUG): [*] -> [read]
2022-01-07 17:06:27.339380 (DEBUG): [read] -> [read_section_title]
2022-01-07 17:06:27.339982 (DEBUG): [read_section_title] -> [read_section_content]
2022-01-07 17:06:27.340274 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.340710 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.340888 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.341363 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.341504 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.341728 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.341860 (DEBUG): [read_section_content] -> [read_comment]
$ smc profile ini.log#guile #smc #dev #lisp #fsm #profiling
Total transitions: 3528
Total time: 630510 us
Stats:
read_comment: 416994 us (66.1360 %)
read_section_content: 153088 us (24.2800 %)
read_section_property_value: 17230 us (2.7327 %)
read_section_property_key: 16376 us (2.5973 %)
trim_section_property_key: 14990 us (2.3774 %)
trim_section_property_value: 6673 us (1.0583 %)
read_section_title: 4132 us (.6553 %)
read: 1027 us (.1629 %)
GitHub
GitHub - artyom-poptsov/guile-ini: GNU Guile INI library.
GNU Guile INI library. Contribute to artyom-poptsov/guile-ini development by creating an account on GitHub.
Lisp SBCL vs Java - Which programs are fastest? | Computer Language Benchmarks Game
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/lisp.html
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/lisp.html
benchmarksgame-team.pages.debian.net
Lisp SBCL vs Java - Which programs are fastest?
Lisp SBCL Java - Which programs have fastest performance?
Со студентами программированием музыки занимаемся.
(Болт на динамик положен для улучшения звучания.)
(Болт на динамик положен для улучшения звучания.)
This media is not supported in your browser
VIEW IN TELEGRAM
Ещё одно видео с практики -- изучали со студентами широтно-импульсную модуляцию (ШИМ.)
А так мы разбирали инкремент и декремент на практике по Arduino в НРТК.
Случай из практики прошлых лет: пришёл студент на задачу экзамена, говорю ему -- напиши цикл. Он написал. Спрашиваю, а что такое у тебя в коде за i++. Отвечает -- это, мол, "экскремент". С тех пор всем студентам эту байку рассказываю -- помогает в запоминании.
Чтобы в коде небыло "экскрементов" учите термины правильно! :-)
Случай из практики прошлых лет: пришёл студент на задачу экзамена, говорю ему -- напиши цикл. Он написал. Спрашиваю, а что такое у тебя в коде за i++. Отвечает -- это, мол, "экскремент". С тех пор всем студентам эту байку рассказываю -- помогает в запоминании.
Чтобы в коде небыло "экскрементов" учите термины правильно! :-)
Сравнение вычислительной мощности современных компьютеров и компьютеров прошлого: https://spectrum.ieee.org/ibm-mainframe
IEEE Spectrum
A Quadrillion Mainframes on Your Lap
Your laptop is way more powerful than you might realize