Я пытался убедить моего друга избегать использования динамически распределенных массивов и начать переходить к векторам STL. Я отправил ему пример кода, чтобы показать пару вещей, которые можно сделать с помощью STL и функторов / генераторов:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#define EVENTS 10000000
struct random_double {
double operator() () { return (double)rand()/RAND_MAX; }
};
int main(int argc, char **argv){
std::vector<double> vd (EVENTS);
generate(vd.begin(), vd.end(), random_double());
copy(vd.begin(), vd.end(), std::ostream_iterator<double>(std::cout, "\n"));
return 0;
}
Его ответ на этот вопрос, хотя он и чувствует себя более элегантным, заключается в том, что его собственный код работает быстрее (почти в 2 раза!). Вот код C, на который он ответил:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define EVENTS 10000000
__inline double random_double() {
return (double)rand()/RAND_MAX;
}
int main(int argc, char **argv){
unsigned int i;
double *vd;
vd = (double *) malloc(EVENTS*sizeof(double));
for(i=0;i<EVENTS;i++){ vd[i]=random_double(); }
for(i=0;i<EVENTS;i++){ printf("%lf\n",vd[i]); }
free(vd);
return 0;
}
Итак, я запустил простой временной тест, чтобы увидеть, что происходит, и вот что я получил:
> time ./c++test > /dev/null
real 0m14.665s
user 0m14.577s
sys 0m0.092s
> time ./ctest > /dev/null
real 0m8.070s
user 0m8.001s
sys 0m0.072s
Опции компилятора, использующие g ++, были следующими: g ++ -finline -funroll-loops. Ничего особенного. Может кто-нибудь сказать мне, почему версия C ++ / STL медленнее в этом случае? Где узкое место, и смогу ли я когда-нибудь продать своего друга за использование контейнеров STL?