То, что вы видите, является выражением различий в теоретических сложностях времени выполнения, то есть истинных алгоритмах c различий между двумя алгоритмами.
Оптимальная сложность решета с пробным делением равна O (n 1,5 / (log n) 2 ) (*) , тогда как для сита Эратосфена 'сложность составляет O ( n log log n) .
Согласно эмпирическим данным времени выполнения, опубликованным Скоттом Сойетом в комментариях ,
1e6 279ms 36ms
1e7 6946ms 291ms
-------------------------
n^ 1.40 0.91
эмпирические порядки роста примерно равны ~ n 1,4 и ~ n в измеренном диапазоне, что хорошо подходит.
Так что ваше подлинное сито работает хорошо. Сито , пробное деление работает как положено. * * * * * * Алгоритм c природы кода всегда будет превосходить любое присутствие или отсутствие любых вторичных оптимизаций, если мы достаточно увеличим размер задачи.
И сравниваем производительность, измеряя их только в одном Точка размера проблемы никогда недостаточно. Таким образом, даже если вы увидите разницу в 10% по сравнению с «более простой», если вы будете тестировать на больших размерах, разница будет больше.
Если вы хотите несколько советов о том, что можно улучшить в ваш код, обратите внимание, что вы начинаете внутренний l oop с i+i
вместо i*i
, для начинающих.
Другая распространенная оптимизация - это специальный случай 2 , начните с 3 и увеличьте число кандидатов на 2 и используйте внутреннее увеличение l oop 2*i
вместо просто i
, для достижения мгновенного ускорения в 2 раза. Это простейшая форма факторизации колеса оптимизации, которая может быть применена в дальнейшем, с уменьшением отдачи, хотя для каждого дополнительного простого числа. Но использование 2-3-5-7 является обычным делом и должно дать примерно еще 2-кратное ускорение, если память работает.
Последнее, но не менее важное: сделать это сегментировано .
(*) это π(n)
* π(√n)
из простых чисел и не более чем из композитов.