Который является более эффективным для использования в течение l oop, я - PullRequest
0 голосов
/ 26 марта 2020

Кто-нибудь может мне помочь, какой из следующих двух способов более эффективен и корректен?

1.

for(int i = num; i * i <= n; i++)

2.

int root = sqrt(n);
for(int i = num; i <= root; i++)

В первом Подход мы рассчитываем квадрат i каждый раз, когда l oop работает. Также мы не можем предварительно вычислить квадрат i, поскольку i обновляется каждый раз.

Во втором подходе мы не вычисляем sqrt (n) каждый раз. Это экономит время?

Будет ли 2-й l oop работать быстрее со 100% точным результатом даже для больших чисел (например, 10 ^ 6)?

1 Ответ

0 голосов
/ 26 марта 2020

Имеет смысл, что второй сценарий должен быть более эффективным, так как ограничитель l oop не нужно рассчитывать для каждой итерации в l oop. Пытался измерить время процессора, используемое при прохождении двух типов циклов for, с помощью приведенного ниже кода. Похоже, время процессора на самом деле меньше для первого сценария для меньших чисел, таких как n = 25. но тогда для значений n> = 100 второй сценарий дает меньшее время процессора.

    clock_t start,end;
    double cpu_time_used;
    double n, root;

    n = atoi(argv[1]);
    printf("n= %0f \n",n);
    start = clock();
    for (int i=0; i*i<n; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("first iter: cpu_time_used: %f \n", cpu_time_used);

    start = clock();
    root = sqrt(n);
    for (int i=0; i<=root; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("second iter: cpu_time_used: %f \n", cpu_time_used);

Выходы:

n= 25.000000 
first iter: cpu_time_used: 0.000004 
second iter: cpu_time_used: 0.000011 

n= 100.000000 
first iter: cpu_time_used: 0.000002 
second iter: cpu_time_used: 0.000001 

n= 1000000.000000 
first iter: cpu_time_used: 0.000011 
second iter: cpu_time_used: 0.000008 
...