# SBCL: save-lisp-and-die

Steel Bank Common Lisp предоставляет функцию `save-lisp-and-die` для сохранения образа памяти на диск, что используется для создания запускных файлов. Во-первых, это позволяет использовать программы на системах, где не установлен Lisp, и во-вторых, это значительно увеличивает скорость запуска программы.

Полное описание параметров функции представлены на странице [официального руководства](http://www.sbcl.org/manual/#Function-sb_002dext_003asave_002dlisp_002dand_002ddie "SBCL: save-lisp-and-die"). Заинтересовало, как влияет ряд параметров на скорость загрузки и на размер итоговой программы. Для чего провел небольшой эксперимент.

Проводил запуск sbcl (на текущий момент времени SBCL 1.3.14), определял функцию `main`:

```lisp
(defun main ()
  (write-line "hello world"))
```

После чего создал несколько образов с использованием различных параметров:

```lisp
(sb-ext:save-lisp-and-die "hello-compress" :compression 9 :toplevel #'main :executable t)
(sb-ext:save-lisp-and-die "hello" :toplevel #'main :executable t)
```

Для создания 2 образов приходилось запускать sbcl 2 раза, каждый раз определяя функцию `main` и используя определенную функцию для создания образа памяти. В результате получил 2 файла:

```text
-rwxr-xr-x   1 juev  staff    59M Feb 12 12:03 hello
-rwxr-xr-x   1 juev  staff    12M Feb 12 12:06 hello-compress
```

Как видно из приведенного примера, размер образа без компрессии составляет 59 мегабайт. С полной компресией 12 мегабайт. Осталось сопоставить время выполнения полученных программ друг с другом, для этого воспользуемся системной командой `time`:

```shell
$ time ./hello
hello world

real	0m0.201s
user	0m0.014s
sys	0m0.035s
```

Время первой загрузки чистого образа 0.2 секунды. При последующих запусках время сокращается до 0.03 секунд. Теперь посмотрим, влияет ли сжатие образа на время загрузки.

```shell
$ time ./hello-compress
hello world

real	0m0.258s
user	0m0.200s
sys	0m0.047s
```

Видно увеличение времени загрузки, но не значительное. И при этом все последующие запуски обладают примерно тем же временем, без значительного ускорения, что наблюдалось в случае без использования сжатия. То есть при использовании небольших программ использование сжатия при создании образов вполне обосновано.

Если вам интересен Lisp, у вас есть вопросы, или вы хотели бы поделиться своим опытом, приглашаем вас в наше небольшое сообщество [40ants](http://40ants.com "40Ants"). Все обсуждения проходят в [Gitter](https://gitter.im/40ants/team "40Ants Team") чате.

