В общем я обернул глобальный код
Yadryara в функцию, так думаю будет лучше. По ходу дела расставил отступы, чтобы выглядело феншуйно. Можно будет просто добавлять параметры в функцию (я добавил "potok"). На усмотрение
Yadryara, конечно.
Все переменные пообъявлял через
my(), стек должен теперь очищаться исправно.
Функции пишут логи в файлы с именами зависящими от параметра.
Но логи довольно жидкие, так что коллизий там не предвидится, даже если все инстансы будут писать в один файл.
Теперь надо посмотреть внимательно какие ещё переменные могут быть объявлены как small.
Заглянул в Сишный код сгенерированный gp2c и там по циклам видно что все циклы где не фигурируют большие числа (типа numdiv() по кандидатам), управляются счетчиками small.
-- 15.11.2025, 17:46 --А вот от этого никуда не деться, нет других способов подсчитать количество делителей кроме как факторизацией.
Значит, только улучшать конструктор, чтобы он давал больше выхода годных...
Сейчас счёт идёт в диапазоне

, возможно надо идти в

с примерно тем же временем факторизации, но с лучшими шаблонами.
-- 15.11.2025, 18:23 --Хорошо. Значит возвращаемся в форум.
Мне
Yadryara передал код.
Что я сделал.
1. Постарался не особо вникая в код, объявить малые целые типом small
2. removeprimes(addprimes()); я это отключил. памяти потребляется мало (см. ниже), а это лишняя операция. Ну может куда-то повыше ещё её перенести.
3. Обернул код так что теперь это функция ptk() которая принимает на вход номер потока, по умолчанию принимает присваивает 1.
4. Имена лог-файлов разные для разных потоков
5. Мои комментарии пометил как /* wrest:
Предварительные замеры производительности
Код
Yadryara, отключена запись в лог:
Интерпретатор: Время до вывода второй строки 29 сек
Компиляция:время до вывода второй строки 16 сек
Код-функция ptk() с типизацией small и о чём выше написано, вызов ptk(1)
Интерпретатор: Время до вывода второй строки 28 сек
Компиляция:время до вывода второй строки 15 сек
По многозадачности.
Запустил четыре инстанса с номерами потоков 0 1 2 и 4 (почему-то тройку пропустил - не знаю).
За час среднее потребление памяти было по 19..25 мегабайт на инстанс. Рост примерно 3-5 мегабайт в час. Возможно, из-за отключения сброса кеша простых.
И никакого переполнения стека.
Напомню насчёт инстансов. Это пользовательские сессии в одну виртуальную машину линукс в WSL2. То есть, машина (виртуальная) одна, ядро линукс - одно.
Куда-то 10% обещанного дополнительного ускорения пропали :)

но замеры неточные (по
секундомеру в руках), нужна методика по правильному (чтобы чётко понимать) замеру, либо добавления текущей скорости в чём-нибудь (перестановках или ещё в чём) в лог. Тогда будет точно и понятно и одинаково для компиляции, интерпретации, многозадачности и т.п.