Я пытаюсь найти несколько простых чисел с ситом алгоритма греческого парня. У меня есть проблемы с эффективностью. Вот код:Действительно ли избыточный избыточный код эффективен?
void check_if_prime(unsigned number)
{
unsigned index = 0;
while (primes[index] <= std::sqrt(number))
{
if (number % primes[index] == 0) return;
++index;
}
primes.push_back(number);
}
И, потому что я закодирован огромное 2/3/5/7/11/13 простого колеса, код 5795 линия тоскует.
for (unsigned i = 0; i < selection; ++i)
{
unsigned multiple = i * 30030;
if (i!=0) check_if_prime(multiple+1);
check_if_prime (multiple+17);
check_if_prime (multiple+19);
check_if_prime (multiple+23);
// ...so on until 30029
}
Optimization флаги: -O3, -fexpensive-оптимизационные -march = pentium2
25000000 простых чисел в 20 минут с процессором застрял на 50% (не знаю, почему, пытались в реальном времени приоритет, но Бесполезный сильно меняются). Размер выходного текстового файла составляет 256 МБ (позже будет изменен на двоичный файл).
- Сборник требует времени! Это нормально? Как я могу сделать это быстрее без ущерба для эффективности?
- Это утверждение if в начале цикла for OK? Я читал, если утверждения занимают больше всего.
- Что-либо еще относительно кода, а не алгоритма? Что-нибудь, чтобы сделать это быстрее? Какие заявления быстрее других?
- Может быть, даже большее колесо (до 510510, а не только 30030, черт возьми много линий) скомпилируется в течение дня?
Я хочу найти все простые числа до 2^32, а небольшая оптимизация сэкономит несколько часов и электроэнергии. Заранее спасибо!
EDIT: не ищет алгоритм, добиваясь улучшения кода, если это возможно!
С этого момента я собираюсь назвать это Ситовым [Греческим парнем] (https://en.wikipedia.org/wiki/Eratosthenes). – tux3
К сожалению, у него очень сложное имя, как написание, так и произношение, и я не носитель языка. –
Возможный дубликат [Какой самый быстрый алгоритм для нахождения простых чисел?] (Http://stackoverflow.com/questions/453793/which-is-the-fastest-algorithm-to-find-prime-numbers) –