тригонометрические функции - PullRequest
       4

тригонометрические функции

1 голос
/ 24 сентября 2010

Я хочу сделать грех функционирующим.так вот мой код:

inline double _cdecl Sin(double Rad)
{
    _asm
    {
        fld QWORD PTR [Rad]
        fsin 
    }
}

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

for(int i = 0; i < 1000000; ++i)
       sin(1)

, стандартный грех будет быстрее в соотношении около 3, и если я сделаю

for(int i = 0; i < 1000000; ++i)
       sin(i)

моя функция будет быстрее примерно в 3. Что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Компилятор может знать, что sin(1) является встроенной чистой функцией без побочных эффектов, и поэтому даже не потрудится вызвать ее внутри цикла. Таким образом, вы можете в конечном итоге просто синхронизировать сам цикл. Проверьте сгенерированный код сборки, используя соответствующий переключатель компилятора для вывода сборки.

0 голосов
/ 24 сентября 2010

Разве компилятор лучше не оптимизирует первую версию со стандартным грехом и не обнаружит ее константу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...