Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Почему меня беспокоит размер программы

В комментариях к одной из заметок, где я показывал программу на Гугл Гоу меня спросили почему мне так важен размер программы, я там как раз сетовал, что размер скомпилированной программы получился около четырёх мегабайт.

С одной стороны, конечно, средства хранения сейчас дёшевы и для современных дисков это не объём. С другой стороны, с оперативной памятью всё несколько похуже. Мы пока разделяем два пространства: пространство выполнения программ и пространство их хранения. Хотя идут эксперименты по их совмещению, в продаже пока ничего подобного нет.

Поэтому данность: количество оперативной памяти ограничено, в случае моего ноута — сильно ограничено, у меня их всего 2ГиБ, это мало по нынешним временам, но что делать. Типичные современные объёмы оперативной памяти не отличаются от этой цифры на порядки, обычно это 4—8 ГиБ.

Моя память (17.74КиБ)

Соответственно, меня расстраивают большие программы просто по той причине, что они занимают много памяти, которой и так немного. Если у вас открыт браузер, Фотошоп, Офис и ещё что-то, велика вероятность, что свободной памяти в системе почти нет и запуск ещё одной программы вызовет сброс на диск какого-то региона памяти и высвобождение его для новой программы.

Соответственно, чем больше некомпактных утилит (например, на «Гоу») будет работать, тем меньше у меня памяти, тем медленнее система, что меня расстраивает, конечно.

11 комментариев
SunChaser (sunchaser.info) 2013

Размер скомпилированной программы это далеко не всё. Например, я переписал считалку тарифов для питерского метро с C++ на Rust. Скомпилированные проги различаются в 2 раза — 22 кб против 51, а вот потребление памяти выросло в 10 раз

Евгений Степанищев (bolknote.ru) 2013

Комментарий для sunchaser.info:

Согласен, так тоже бывает, но это размер скомпилированной программы я сразу вижу и он меня сразу расстраивает :)

zg (zg.livejournal.com) 2013

Комментарий для Евгения Степанищева:

сжатие upx приводит к дополнительному потреблению ram. особенно, если запускается более одной копии программы одновременно.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для zg.livejournal.com:

UCL-декомпрессор достаточно прост, чтобы быть реализованным в нескольких сотнях байт, и при работе не требует выделения дополнительной памяти.

http://ru.wikipedia.org/wiki/UPX

Правда, версия UPX 3 и выше использует LZMA, по-умолчанию.

zg (zg.livejournal.com) 2013

Комментарий для Евгения Степанищева:

для распакованного кода для каждой копии программы будет отдельная копия. для нормального — одна на всех. распакованный код вытесняется в своп.
ну и оверхеда в 100 байт не бывает. минимум 4кб. на практике возможно и больше.

rodem 2013

Ну тут два варианта:
 — поменять ноутбук
 — применить другой инструмент, вместо golang
Придётся искать компромисс, как ни крути.

Fun fact: Google statically links all their C/C++ code they run on their servers.
It seems you are severely confused regarding the characteristics of dynamic vs. static linking. Static linking is faster and more efficient.
If you have many processes static linking also means fork() is much faster.
http://www.reddit.com/r/golang/comments/tqudb/are_go_binaries_really_entirely_statically_linked/c4p1awi

Евгений Степанищев (bolknote.ru) 2013

Комментарий для rodem:

Я уже писал, что он не весь статически линкуется:

otool -L corner
corner:
/usr/local/lib/libgd.2.0.0.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 0.0.0, current version 0.0.0)

If you have many processes static linking also means fork() is much faster.

Интересно, откуда в Гоу форк и для чего он там?

Евгений Степанищев (bolknote.ru) 2013

Комментарий для rodem:

Ну тут два варианта:

  • поменять ноутбук

Как не меняй, беда в том, что оперативной памяти на порядок не увеличится. Обычные цифры — 4—8. А аппетиты Гоу растут. Версия 0.60 компилировала одну мою программу в файл размером 1,6 мегабайта, версия один компилирует уже в файл размером 2,2МиБ.

rodem 2013

Обычные цифры — 4—8

но с другой стороны, сейчас 2Гб, из них система съедает условно 1Гб. Будет 8, система всё равно будет кушать 1, а 7 тебе. Вполне себе порядок.

А аппетиты Гоу растут. Версия 0.60 компилировала одну мою программу в файл размером 1,6 мегабайта, версия один компилирует уже в файл размером 2,2МиБ.

ну линейная экстраполяция тут явно лишняя «через 10 лет, программы будут весить 1Гб»

Опять же 8Гб + ретина, вполне себе «повод» для замены рабочего инструмента.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для rodem:

Опять же 8Гб + ретина, вполне себе «повод» для замены рабочего инструмента.

Я не могу так вот просто покупать себе ноутбуки.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для rodem:

но с другой стороны, сейчас 2Гб, из них система съедает условно 1Гб. Будет 8, система всё равно будет кушать 1, а 7 тебе.

Если бы я писал систему, я бы сделал зависимые от размера памяти кеши.