Простое изменение покажет вам, как быстро работает ваша программа и сколько работы она должна выполнить. Легко распечатать ваш статус каждые 100 итераций.
(Или вы можете установить его на 1000 или 10000 итераций.)
Признайте, что вы можете DOUBLE скорость вашего цикла в IsPrime
.
После того, как вы проверите 2, вам нужно только проверить нечетные числа, и вы можете перейти с i+=2
вместо i++
.
Если вы беспокоитесь о скорости, почему вы тратите так много времени на проверку четных чисел?
(обратите внимание, что, как только вы начинаете делать только нечетные числа, вам также нужно изменить выходной тест на нечетное число)
Вы можете DOUBLE скорость цикла в main
, также избегая четных чисел там. (опять же, вам нужен особый случай 2, затем используйте i + = 2, начиная с 3, чтобы получить 3, 5, 7, 9 ....)
Если цикл в IsPrime
выполняется в два раза быстрее, а цикл в main
- в два раза быстрее, это должно ускорить вашу программу на 4X . (если бы это заняло час раньше, сейчас это займет 15 минут.)
Другое большое улучшение скорости, которое вы могли бы сделать, это только запустить цикл до sqrt(num)
вместо num
Так как я ненавижу вводить функции с плавающей запятой, такие как sqrt
, я вместо этого предлагаю близкое приближение, которое останавливается в течение 100 итераций после прохождения границы sqrt, а также регулярно отображает обновления статуса.
if (num%2 == 0)
{
flag=0;
return flag;
}
/* Now that we checked 2, we only need to check odd numbers from now on. */
for(i=3;i<num;i+=2)
{
if (i%101 == 0)
{
printf("i is %d out of %d\n", i, num);
if (i*i > num)
{
break; /* If you pass the sqrt boundary, quit. */
}
}
if(num%i==0)
{
flag=0;
break;
}
}
P.S. Я поместил этот код в проект C # (незначительное портирование).
Конечно, теперь он работал на 64-битной ОС, с лучшим компилятором и процессором 2,8 ГГц.
Это бежало менее чем за 20 секунд.