Страниц: [1]
  Печать  
Автор Тема: Быстродействие функции pow(double, double) в QNX 6.4.1  (Прочитано 2779 раз)
gleb
Участник
*
Offline Offline

Сообщений: 18


Просмотр профиля
« : Мая 14, 2010, 09:30:16 am »

Вот результат измерения времени выполнения функции pow(double, double) для различных чисел (время измерялось при помощи ClockCycles(), Y - показатель степени, первое число в каждой строчке - агрумент)
Код:
***** Y=1/10 *****
2.225074e-308: 1.560477 mks
1.000000e-200: 9.521304 mks
1.000000e-100: 10.971173 mks
1.000000e+00: 0.143492 mks
1.000000e+100: 11.434533 mks
1.000000e+200: 9.721595 mks
1.797693e+308: 5.557333 mks

***** Y=1/3 *****
2.225074e-308: 1.742832 mks
1.000000e-200: 9.721595 mks
1.000000e-100: 11.297020 mks
1.000000e+00: 0.164418 mks
1.000000e+100: 12.274560 mks
1.000000e+200: 10.642337 mks
1.797693e+308: 6.104397 mks

***** Y=3 *****
2.225074e-308: 0.762302 mks
1.000000e-200: 7.040085 mks
1.000000e-100: 8.486965 mks
1.000000e+00: 0.167408 mks
1.000000e+100: 9.072891 mks
1.000000e+200: 7.548287 mks
1.797693e+308: 3.841405 mks

***** Y=10 *****
2.225074e-308: 0.771270 mks
1.000000e-200: 7.090905 mks
1.000000e-100: 8.717150 mks
1.000000e+00: 0.167408 mks
1.000000e+100: 9.297098 mks
1.000000e+200: 7.407784 mks
1.797693e+308: 4.101485 mks

Аналогичный опыт в 6.3.2 дает времена, меньшие на 1-2 порядка:

Код:
***** Y=1/10 *****
2.225074e-308: 0.131531 mks
1.000000e-200: 0.200286 mks
1.000000e-100: 0.203275 mks
1.000000e+00: 0.170393 mks
1.000000e+100: 0.203275 mks
1.000000e+200: 0.203275 mks
1.797693e+308: 0.203275 mks

***** Y=1/3 *****
2.225074e-308: 0.131531 mks
1.000000e-200: 0.203275 mks
1.000000e-100: 0.203275 mks
1.000000e+00: 0.188329 mks
1.000000e+100: 0.206265 mks
1.000000e+200: 0.206265 mks
1.797693e+308: 0.203275 mks

***** Y=3 *****
2.225074e-308: 0.212243 mks
1.000000e-200: 0.239148 mks
1.000000e-100: 0.143489 mks
1.000000e+00: 0.128542 mks
1.000000e+100: 0.143489 mks
1.000000e+200: 0.239148 mks
1.797693e+308: 0.239148 mks

***** Y=10 *****
2.225074e-308: 0.212243 mks
1.000000e-200: 0.251105 mks
1.000000e-100: 0.254094 mks
1.000000e+00: 0.143489 mks
1.000000e+100: 0.254094 mks
1.000000e+200: 0.254094 mks
1.797693e+308: 0.254094 mks

Если подойти философски, то это не баг - результат вычисления правильный. Но все-таки возникает вопрос: что делает эта функция столько времени?
З.Ы. Не удивлюсь, если в 6.5.0 что-нибудь типа printf("Hello, world!"); будет выполняться секунд за 20.
« Последнее редактирование: Мая 14, 2010, 09:49:18 am от gleb » Записан
gleb
Участник
*
Offline Offline

Сообщений: 18


Просмотр профиля
« Ответ #1 : Мая 14, 2010, 09:40:46 am »

Вспоминаю, чему учили в школе на уроках математики, и заменяю функцию pow() на свой аналог (который, правда, не работает с отрицательными числами):
Код:
double MyPow( double X, double Y ) {  return exp( Y*log(X) );  }

И, о, чудо:

Код:
***** Y=1/10 *****
2.225074e-308: 0.128545 mks
1.000000e-200: 0.131534 mks
1.000000e-100: 0.131534 mks
1.000000e+00: 0.113598 mks
1.000000e+100: 0.134524 mks
1.000000e+200: 0.134524 mks
1.797693e+308: 0.134524 mks

***** Y=1/3 *****
2.225074e-308: 0.128545 mks
1.000000e-200: 0.131534 mks
1.000000e-100: 0.134524 mks
1.000000e+00: 0.134524 mks
1.000000e+100: 0.134524 mks
1.000000e+200: 0.134524 mks
1.797693e+308: 0.134524 mks

***** Y=3 *****
2.225074e-308: 0.083704 mks
1.000000e-200: 0.227196 mks
1.000000e-100: 0.134524 mks
1.000000e+00: 0.134524 mks
1.000000e+100: 0.134524 mks
1.000000e+200: 0.224207 mks
1.797693e+308: 0.197302 mks

***** Y=10 *****
2.225074e-308: 0.083704 mks
1.000000e-200: 0.089683 mks
1.000000e-100: 0.089683 mks
1.000000e+00: 0.134524 mks
1.000000e+100: 0.185344 mks
1.000000e+200: 0.182355 mks
1.797693e+308: 0.188333 mks
Записан
gleb
Участник
*
Offline Offline

Сообщений: 18


Просмотр профиля
« Ответ #2 : Мая 14, 2010, 09:47:28 am »

Если изменить MyPow(), чтобы логарифм вычислялся по основанию 2, получается еще немного быстрее:
Код:
double MyPow( double X, double Y ) {  return exp( Y*logb(X)/M_LN2 );  }
Кстати, с pow( float, float ) таких вещей не наблюдается - выполняется за 0.040 - 0.055 мкс. Причем в 6.3.2 чуть быстрее, чем в 6.4.1.
Записан
Страниц: [1]
  Печать  
 
Перейти в: