типа Go/D/Haskell/OCaml, вставляют GC в конкретную программу, т.е. в каждом отдельном случае GC должен хорошо работать именно для заданной программы, а для всех остальных — пофиг. Это значит, что GC можно специализировать под программу.
Как простейший пример, допустим, GC делает pooled allocations, т.е. аллоцирует объекты близких размеров в специальных аренах. Когда мы компилируем конкретную программу, мы знаем все типы, которые она использует, и их размеры. Значит, мы можем при компиляции посчитать более-менее оптимальное количество арен и размеров аллокаций чтобы эффективно распихивать именно объекты из нашей программы, и "захардкодить" это в GC.
Внимание вопрос: кто-нибудь на практике так делает?
Так ведь было же в PLComp! https://t.me/plcomp/28
Это немного в другую сторону. Я думал про (простую) специализацию или даже всего лишь подстройку параметров GC под конкретную программу (и ahead of time).
Для знания всех размеров нужно также отсутствие массивов с динамически задаваемой длиной, на что готовы пойти лишь немногие. Думал о таком в рамках Oberon, так как в нём как раз нет таких массивов, но не более чем думал 😆.
Нет, не нужно. Их можно скидывать в отдельный пул или "спускать" в системный аллокатор — это ортогональный вопрос, который никак не мешает остальным.
мешает в плане соотношения полезности к усложнению
Ну да, какой смысл в такой подстройке, если потом большАя часть будет загнана через make(uint8, len)
Не знаю, потому и спрашиваю. Кому-то, может, есть смысл, кто-то, может, замерил увеличение производительности?
Обсуждают сегодня