У меня есть следующий код, и я ожидаю, что будет использоваться встроенная версия функции exp()
. К сожалению, его нет в сборке x64, что делает его медленнее, чем аналогичный Win32 (, т.е. 32 -битная сборка ):
#include "stdafx.h"
#include
#include
#include
int main()
{
const int NUM_ITERATIONS=10000000;
double expNum=0.00001;
double result=0.0;
for (double i=0;i
. Я использую следующие переключатели для своей сборки:
/Zi /nologo /W3 /WX-
/Ox /Ob2 /Oi /Ot /Oy /GL /D "WIN32" /D "NDEBUG"
/D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm-
/EHsc /GS /Gy /arch:SSE2 /fp:fast /Zc:wchar_t /Zc:forScope
/Yu"StdAfx.h" /Fp"x64\Release\exp.pch" /FAcs /Fa"x64\Release\"
/Fo"x64\Release\" /Fd"x64\Release\vc100.pdb" /Gd /errorReport:queue
Как видите, я делаю иметь /Oi
, /O2
и /fp:fast
в соответствии с требованиями статьи MSDN о внутренних функциях . Тем не менее, несмотря на мои усилия, обращение к стандартной библиотеке выполняется, что замедляет работу exp()
на сборках x64.
Вот сгенерированная сборка.:
for (double i=0;i
Как вы можете видеть в приведенной выше сборке, есть вызов функции exp()
. Теперь давайте посмотрим на код, сгенерированный для этого for
цикла с 32-битной -сборкой :
for (double i=0;i
. Там намного больше кода, но он быстрее. Тест синхронизации, который я провел на хосте Nehalem -EP с частотой 3,3 ГГц, дал следующие результаты:
32 -бит:
Среднее время выполнения тела цикла :34,849229 циклов / 10,560373 нс
64 -бит:
Среднее время выполнения для тела цикла :45,845323 цикла / 13,892522 нс
Действительно, очень странное поведение. Почему это происходит?
Обновление:
Я создал отчет об ошибке Microsoft Connect . Не стесняйтесь голосовать за него, чтобы получить авторитетный ответ от самой Microsoft об использовании встроенных функций с плавающей запятой, особенно в коде x64.