Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.0.240] |
|
Сообщ.
#1
,
|
|
|
Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool.
И есть вектор (std::vector) measuresvector, каждый элемент которого относится к типу Measure_Simulation. Этот вектор имеет 40 тысяч таких элементов. Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код: std::back_insert_iterator<std::vector <Measure_Simulation> > toV(measuresvector2); std::copy(measuresvector.begin(),measuresvector.end(),toV); Этот процесс копирования занимает 20 секунд. Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать? |
Сообщ.
#2
,
|
|
|
Попробуй перед копированием добавить
measuresvector2.reserve(measuresvector.size()); Добавлено Если результат не устроит, то остаётся лишь пробовать оптимизировать конструктор Measure_Simulation. Кроме того, смущает, что в Measure_Simulation есть char*. Есть большое подозрение, что коли нет конструктора, адекватно обрабатывающий это поле, с ним будут проблемы. P.S. Если нужно именно копирование, то результат больше не улучшить. Но если достаточно будет перемещения, то нет необходимости в копировании с последующем разрушении оригинала, гораздо проще переместить: measuresvector2 = std::move(measuresvector); |
Сообщ.
#3
,
|
|
|
Цитата erslgoeirjh @ Какой код для этого следует использовать? Переработать "хранилище" источника и использовать std::memcpy для копирования в приемник - быстрее не получишь! Но как говорится, есть нюанс. Как написал Qraizer ... Цитата Qraizer @ P.S. Если нужно именно копирование Имеет смысл озвучить всю задачу. Очень часто бывает, что форумчанин выдумает себе не самое лучшее решение задачи, и тут же несется его оптимизировать. А оно ни в какую. Но всегда (или почти всегда) есть альтернативные решения, которые оч часто и проще, и лучше по всем параметрам. Попробуй спросить про это |
Сообщ.
#4
,
|
|
|
Цитата erslgoeirjh @ Этот процесс копирования занимает 20 секунд. Либо ты на pentium 100Mgz этим копированием занимаешься, либо что то недоговариваешь. Например измерения в debug делаешь либо твоя структура или одно из её полей кастомный конструктор копирования имеет либо еще какая нить фигня. за 20 секунд не один гигабайт памяти скопировать можно. Да, а чем просто measuresvector2 = measuresvector не устраивает ?? |
Сообщ.
#5
,
|
|
|
jack128, тут штото нетак! Но ТС не озвучивает предпосылов
|
Сообщ.
#6
,
|
|
|
Цитата erslgoeirjh @ ... Этот вектор имеет 40 тысяч таких элементов. Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код: Этот процесс копирования занимает 20 секунд. Что-то не так. "Не верю" © 20[c] = 20000[mc] 20000 / 40000 = 0.5[mc]/объект. И каких же размеров объект ?!! Если он 100500 триллионов мегабайт то возможно. Но вообще скорость получилась невероятно медленная. --- Можно попробовать простой тест - копировать массивы в стиле "С" указанного размера. Быстрее не будет. |
Сообщ.
#7
,
|
|
|
Цитата ЫукпШ @ Можно попробовать простой тест - копировать массивы в стиле "С" указанного размера. Быстрее не будет. Цитата JoeUser @ и использовать std::memcpy для копирования да-да-да |
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ @ Целевой вектор изначально пуст, не зря же третьим параметром идёт std::back_insert_iterator<>, поэтому вектор делает 100500 перераспределений. std::vector<>::reserve() решает проблему.Если он 100500 триллионов мегабайт то возможно. Цитата JoeUser @ std::copy() для POD и так способен сделать такую оптимизацию. да-да-да |
Сообщ.
#9
,
|
|
|
Цитата Qraizer @ для POD Переход на POD, думаю, для ТС будет одним из решений. |
Сообщ.
#10
,
|
|
|
Цитата JoeUser @ Переход на POD, думаю, для ТС будет одним из решений. я попробовал сделать тест - просто интересно. Два массива в стиле С (из некоторых структур) размером 24000000 итемов копируются друг в друга. Общий размер каждого - 750М. Истачена вся память компа, приблизительно 10-летней старости. Время копирования около 500-550 [мс]. |