LINUX.ORG.RU

Влияние флагов оптимизации на результаты исполнения программы


0

0

#include <stdio.h>
#include <sys/time.h>

int main (void)
{
    long long int i;
    struct timeval t1, t2;
    double a=1234567890, b;

    gettimeofday (&t1, NULL);
    for (i=0; i<1000000000; i++)
    {
        a--;
        b = a;
        b /= 256 * 128;
    }
    gettimeofday (&t2, NULL);

    printf ("Sec  --->%u\n", (unsigned int) (t2.tv_sec - t1.tv_sec));
    printf ("Usec --->%u\n", (unsigned int) (t2.tv_usec > t1.tv_usec ? t2.tv_usec - t1.tv_usec : t1.tv_usec - t2.tv_usec));

    return 0;
}

**********************************

> gcc -Wall  test.c -o test
> ./test
Sec  --->19
Usec --->139116
>

**********************************
> gcc -Wall  -O2  test.c -o test
> ./test
Sec  --->0
Usec --->1
>



Почему так?

anonymous

Re: Влияние флагов оптимизации на результаты исполнения программы

Смысла во всём этом цикле нет, поскольку значение переменных a и b нигде не используется, так что компилятор имеет полное право вообще выкинуть весь цикл. Выводи значения a и b через printf и посмотри на результат (printf ("a=%f b=%f\n", a, b); в конец добавь).

ji ()

Re: Влияние флагов оптимизации на результаты исполнения программы

Точно!  Спасибо.  Вот результаты :


> ./test
a=234567890.000000  
b=7158.443909
Sec  --->22
Usec --->426440


> ./test
a=234567890.000000  
b=7158.443909
Sec  --->2
Usec --->576843
>


Т.е. при оптимизации и результат правильный и скорость исполнения в 7-8 раз возросла. Познавательно, однако :)

anonymous ()

Re: Влияние флагов оптимизации на результаты исполнения программы

Делишь b на степень двойки, это не интересно, потому что такие вещи он заменяет на побитовай сдвиг (который, разумеется быстрее деления). Попробуй делить не на степень двойки.

anonymous ()

Re: Влияние флагов оптимизации на результаты исполнения программы

> Делишь b на степень двойки, это не интересно, потому что такие вещи он заменяет на побитовай сдвиг (который, разумеется быстрее деления).

А теперь обрати внимание что b это число с плавающей точкой, вспомни форматы плавающей точки и подумай что с ним случится после битового сдвига.

dilmah ★★★★★ ()

Re: Влияние флагов оптимизации на результаты исполнения программы

Не ищите особого смысла в приведеном коде. Это был всего лишь пример, проверяющий влияние флагов оптимизации :) Теперь я начинаю понимать, как эта кухня работает.

anonymous ()

Re: Влияние флагов оптимизации на результаты исполнения программы

Вообще забавно посмотреть дебаггером исполнение такого кода... без бутылки разобраться трудно))

fizteh ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.