Прямо сейчас, это должно быть
действительно быстро, так как цикл не будет выполняться.
Лично я бы, вероятно, использовать что-то вроде этого:
struct gen_rand {
double range;
public:
gen_rand(double r=1.0) : range(r) {}
double operator()() {
return (rand()/(double)RAND_MAX) * range;
}
};
std::vector<double> x(num_items);
std::generate_n(x.begin(), num_items, gen_rand());
Edit: Это чисто микро-оптимизации, которая не может сделать никакой разницы, но вы могли бы рассмотреть переставляя вычисления, чтобы получить что-то вроде :
struct gen_rand {
double factor;
public:
gen_rand(double r=1.0) : factor(range/RAND_MAX) {}
double operator()() {
return rand() * factor;
}
};
конечно, есть очень хороший шанс, компилятор уже делают это (или что-то эквивалентное), но это не повредит попробовать в любом случае (хотя это на самом деле, вероятно, только чтобы помочь с выключенной оптимизацией) ,
Edit2: «ИЙ» (как это обычно бывает) права: вы могли бы получить немного, первоначально резервирование места, затем с помощью вставки итератора, чтобы поместить данные на место:
std::vector<double> x;
x.reserve(num_items);
std::generate_n(std::back_inserter(x), num_items, gen_rand());
Как и раньше , мы находимся в такой микроскопической оптимизации, я совсем не уверен, что действительно ожидал бы, чтобы увидеть разницу вообще. В частности, поскольку все это делается с помощью шаблонов, есть очень хороший шанс (если не все), код будет генерироваться встроенным. В этом случае оптимизатор, скорее всего, заметит, что исходные данные все будут перезаписаны, и пропустите его инициализацию.
В конце концов, однако, почти единственная часть, которая действительно , вероятно,, чтобы сделать существенную разницу, заключается в том, чтобы избавиться от .at(i)
.Остальные могут, но с включенными оптимизациями я бы не ожидал их.
Правильный тип доступа к элементу данных вектора по индексу: 'std :: vector <...> :: size_type', а не' int'. – sbi
Я полагаю, что обычные компиляторы будут перемещать «диапазон/RAND_MAX» из цикла в своих оптимизаторах? – sbi
Любопытно узнать, действительно ли профайлер идентифицировал это как проблему. – Puppy