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

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

ji
()
Ответ на: комментарий от ji

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


> ./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
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от dilmah

>b это число с плавающей точкой

OMG слона не заметил

anonymous
()

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

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