и разности по 1 байту на каждое простое.
Учтите что
разности между соседними простыми (очень полезные данные для оценки, сохраните и сверяйтесь) растут и для числа
становятся больше
. Если хранить половину разности (всё равно она чётная), то переполнение байта будет на числе
, которое к моему и вашему счастью в 140 раз больше
. Однако даже 300млрд не так уж много, это всего минут 10 работы хорошего генератора ... А все простые до
, которых
, займут 100МБ. И даже если их хранить в прямом виде, как int32, то это 400МБ, вполне терпимо для компьютера.
Потому что поиск простых чисел — это только вспомогательная задача, основная задача будет полученный массив в своей работе использовать.
Тут вопрос как именно их использовать. Нужно произвольное обращение к списку или можно его пройти последовательно (пусть даже несколько раз, но не сотни). Если произвольное, то хранить массив (разностей или прямо, не суть), если можно пройти последовательно, то массив не хранить, обрабатывать по мере получения.
Если хранить разности, то можно завести дополнительный массив, в котором хранить точную величину каждого сотого (тысячного) простого, для ускорения прохода по разностям.
Если часты повторные обращения к близким простым, то при запросе одного соседние к нему просчитать и пересохранить в отдельный массив-кэш, из которого их вынуть значительно быстрее в следующий раз. Можно задействовать и стандартный тип хэштаблиц.
Но повторю, лучше заранее оценить время обработки и время генерации, возможно генерация займёт менее 1% общего времени и можно её перезапускать и не хранить все простые.
А ещё можно один раз их просчитать, сохранить в файл (уж 400МБ найти на диске не проблема вообще), а потом пользоваться отображением файла в память. Оно работает быстро, удобно и кэшируется самой ОС и не требует наличия свободной физической памяти такого же объёма, в отличии от чтения файла в память (или расчёта).
Причём самое парадоксальное, уменьшение размера приводит к увеличению скорости работы.
Странно, у меня тенденция наоборот, скорость растёт при увеличении размера сегмента. Но возможно у меня программа оптимальнее и тормозит в другом месте чем у Вас, потому и тенденция другая. Или для малых чисел тенденция меняется, что тоже возможно, я до
вообще не оптимизировал счёт.
Не знаю, актуален ли для Java вопрос использования кэшей процессора
У Вас Java выполняется не на процессоре?
А если на нём, то актуален. Но у вас сегмент и так меньше L1, ещё меньше делать имеет смысл только если скорость реально растёт.
К сожалению, размер сегмента у меня ограничен снизу в связи с тем, что при обработке первого сегмента решета происходит поиск проверяющих простых делителей и инициализация массива смещений.
Заведите для работы первого цикла отдельный массив, уж лишняя сотня КБ, тем более временно, совершенно не жалко.