Глядя на свой код, вы выполняете огромное количество выделений в своем узком цикле - на каждой итерации вы динамически выделяете два двухэлементных вектора, а затем помещаете их обратно в вектор результата (создавая копии обоих эти векторы); последний толчок назад иногда вызывает перераспределение и копирование векторного содержимого.
Распределение кучи относительно медленное, даже если ваша реализация использует быстрый распределитель фиксированного размера для небольших блоков. В худшем случае распределитель общего назначения может даже использовать глобальную блокировку; если это так, это уничтожит любые выгоды, которые вы можете получить от многопоточности, поскольку каждый поток будет тратить много времени на ожидание выделения кучи.
Конечно, профилирование скажет вам, ограничивает ли выделение кучи вашу производительность или это что-то еще. Я бы сделал два конкретных предложения, чтобы сократить ваши кучи:
- Поскольку каждый экземпляр внутреннего вектора имеет два элемента, вам следует рассмотреть возможность использования
std::array
(или std::tr1::array
или boost::array
); array
«контейнер» не использует выделение кучи для своих элементов (они хранятся как массив C).
- Поскольку вы примерно знаете, сколько элементов вы собираетесь поместить в вектор результатов, вы можете
reserve()
оставить достаточно места для этих элементов перед их вставкой.