Попробуйте построить аргумент для compute
один раз за пределами цикла. Если компилятор не исключает создание аргумента std::vector<Vector>
, это, скорее всего, приведет к выделению кучи:
std::vector<Vector> arg{va, vb, vc};
for(unsigned int i=0; i<loopMax; ++i)
{
res += compute(arg);
}
Если есть выделение кучи, это, скорее всего, займет гораздо больше времени, чем остальная часть содержимого цикла. Время, которое занимает выделение кучи, может сильно различаться в зависимости от системы и реализации. Удаление его, вероятно, значительно повысит производительность в обоих случаях.
Если в вашем фактическом коде необходимо каждый раз создавать вектор, то вам следует рассмотреть возможность использования массива фиксированного размера (raw-массив или std :: array), который будет размещаться не в куче, а в стеке, что намного быстрее. Это кажется применимым, потому что вы используете именно три элемента в вашей реализации compute
.
Если вы не знаете длину вектора во время компиляции, и необходимо восстанавливать его каждый раз в цикле с горячей передачей, тогда вы можете быть в состоянии использовать повторно выделенную кучу пробел, тем более если вы можете указать правильное предположение для максимальной длины:
std::vector<Vector> arg;
arg.reserve(1000); // Allocate for up to 1000 element
for(unsigned int i=0; i<loopMax; ++i)
{
arg.clear();
arg.push_back(va);
[...]
arg.push_back(vn);
res += compute(arg);
}