Стоит ли считать статическую копию дорогостоящей? - PullRequest
0 голосов
/ 04 февраля 2019

Когда я обхожу коллекцию, скажем, вектор Point s, где Point - это некоторая структура, содержащая данные x, y, z или что-то еще, когда мне нужно преобразовать эти точкик другому типу по одной точке за раз, должен ли я считать это дорогостоящим копированием?

Например, если у меня есть vector<Point> v, я, очевидно, стараюсь избегать:

vector<OtherPointType> vo;
// populate v
std::transform(v.begin(), v.end(), vo.begin(),
   [](Point const& p) { return OtherPointType{p.x, p.y, p.z}; });
SomeOperation(vo); // Can only operate on vector<OtherPointType>

Но разве это так же дорого, как делать:

for_each(..., [](Point const& p)
{
   OtherPointType opt(p.x, p.y, p.z);
   SomeOperation(opt); // Can only operator on `OtherPointType`
});

?

Мой инстинкт говорит, что, поскольку последний является статической копией без каких-либо динамических выделений, он не должен быть дорогим, но я подумал, что это достаточно важно, чтобы спросить.

Обычно я могу использовать что-то вроде Eigen::Map в последнем случае, но даже там я все еще пишу в два int с (в стеке), я думаюиз-за Eigen::Stride (это даже хорошее решение в этом случае?) Но есть и такие библиотеки, как CGAL, которые не имеют картографических возможностей, и мне любопытен хороший подход к работе с ними.

Обратите внимание, моя работа обычно имеет миллион очков в секунду, поэтомуВажно, чтобы я старался максимально сократить количество дорогих копий.

Обновление

К подвопросу, где мне было интересно, будет ли Eigen::Mapхорошо в последнем случае, указанном выше:

Я провел тест , и, по крайней мере, с gcc 5.4, даже с 100 миллионами очков, результаты слишком близки для вызова.При использовании Eigen::Map против построение Eigen::Vector3d заняло 276 мс против 285 мс соответственно.С меньшим количеством точек, хотя создание заняло меньше времени, что говорит мне, что разница здесь в неопределенности, и другие процессы, которые выполнялись на моем компьютере, вероятно, оказали большее влияние.

1 Ответ

0 голосов
/ 04 февраля 2019

стоит ли считать [преобразование] дорогостоящим копированием?

Поскольку это другая операция, не обязательно.Это может быть более или менее дорогостоящим.Однако разумно оценить его сравнимо с копией.

Но [копирование вектора] стоит так же дорого, как [итерация вектора и копирование каждого элемента в автоматическую переменную]

Вероятно, нет.

Мой инстинкт говорит, что поскольку последняя представляет собой статическую копию без каких-либо выделений, она не должна быть дорогой

Этопоэтому последнее, вероятно, не так дорого, как первое.Но дорого ли последнее, зависит от контекста.Это все еще операция с линейной асимптотической сложностью, поэтому, если вектор большой, распределение может быть незначительным по сравнению с копиями.

Является ли что-то более дорогим, чем что-либо другое на вашем оборудовании, и является ли что-тодорого в контексте вашей программы, вы можете попытаться выяснить это с помощью профилировщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...