Re: проблема при использовании STL
От: Андрей Тарасевич Беларусь  
Дата: 27.03.02 02:07
Оценка: 12 (3)
Здравствуйте Pavel XP, Вы писали:


PX>

PX>
PX>double *aa = new double [DIMSIZE];
PX>   double *bb = new  double [DIMSIZE];

PX>   Вариант 1.

PX>   double p=0;
PX>   for(int k=0;k<DIMSIZE;k++) p += aa[k]*bb[k];

PX>   Вариант 2.
PX>   p = inner_product(aa, aa+DIMSIZE, bb, 0);
PX>


PX> Вариант2 выполняется в 3 раза медленнее на BCB и в 5 раз на VC.

PX> Это почему так. Может я что не так понял.

Потому что эти два варианта делают разные вещи. В качестве последнего параметра 'inner_product' ты указал '0'. '0' — это константа целого типа. Поэтому 'inner_product' ведет вычисления в рамках целого типа и на каждой итерации тратит время на то, чтобы сконвертировать очередное произведение из типа 'double' в тип 'int'.

Вызывай 'inner_product' так:

p = inner_product(aa, aa+DIMSIZE, bb, 0.0);


И все будет работать одинаково.
Best regards,
Андрей Тарасевич
проблема при использовании STL
От: Pavel XP  
Дата: 27.03.02 00:15
Оценка:
Не подскажите, почему так получается.



double *aa = new double [DIMSIZE];
   double *bb = new  double [DIMSIZE];

   Вариант 1.

   double p=0;
   for(int k=0;k<DIMSIZE;k++) p += aa[k]*bb[k];

   Вариант 2.
   p = inner_product(aa, aa+DIMSIZE, bb, 0);


Вариант2 выполняется в 3 раза медленнее на BCB и в 5 раз на VC.
Это почему так. Может я что не так понял.
Re[2]: проблема при использовании STL
От: Pavel XP  
Дата: 27.03.02 05:02
Оценка:
АТ>Потому что эти два варианта делают разные вещи. В качестве последнего параметра 'inner_product' ты указал '0'. '0' — это константа целого типа. Поэтому 'inner_product' ведет вычисления в рамках целого типа и на каждой итерации тратит время на то, чтобы сконвертировать очередное произведение из типа 'double' в тип 'int'.

АТ>Вызывай 'inner_product' так:


АТ>
АТ>p = inner_product(aa, aa+DIMSIZE, bb, 0.0);
АТ>


АТ>И все будет работать одинаково.


Спасибо. Как сам не догадался.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.