На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Копирование вектора (std::vector)
    Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool.
    И есть вектор (std::vector) measuresvector, каждый элемент которого относится к типу Measure_Simulation. Этот вектор имеет 40 тысяч таких элементов.
    Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код:

    ExpandedWrap disabled
      std::back_insert_iterator<std::vector <Measure_Simulation> >  toV(measuresvector2);
      std::copy(measuresvector.begin(),measuresvector.end(),toV);


    Этот процесс копирования занимает 20 секунд.

    Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?
      Попробуй перед копированием добавить
      ExpandedWrap disabled
        measuresvector2.reserve(measuresvector.size());


      Добавлено
      Если результат не устроит, то остаётся лишь пробовать оптимизировать конструктор Measure_Simulation. Кроме того, смущает, что в Measure_Simulation есть char*. Есть большое подозрение, что коли нет конструктора, адекватно обрабатывающий это поле, с ним будут проблемы.

      P.S. Если нужно именно копирование, то результат больше не улучшить. Но если достаточно будет перемещения, то нет необходимости в копировании с последующем разрушении оригинала, гораздо проще переместить:
      ExpandedWrap disabled
        measuresvector2 = std::move(measuresvector);
        Цитата erslgoeirjh @
        Какой код для этого следует использовать?

        Переработать "хранилище" источника и использовать std::memcpy для копирования в приемник - быстрее не получишь!

        Но как говорится, есть нюанс. Как написал Qraizer ...
        Цитата Qraizer @
        P.S. Если нужно именно копирование

        Имеет смысл озвучить всю задачу. Очень часто бывает, что форумчанин выдумает себе не самое лучшее решение задачи, и тут же несется его оптимизировать. А оно ни в какую. Но всегда (или почти всегда) есть альтернативные решения, которые оч часто и проще, и лучше по всем параметрам. Попробуй спросить про это :)
          Цитата erslgoeirjh @
          Этот процесс копирования занимает 20 секунд.

          Либо ты на pentium 100Mgz этим копированием занимаешься, либо что то недоговариваешь. Например измерения в debug делаешь либо твоя структура или одно из её полей кастомный конструктор копирования имеет либо еще какая нить фигня. за 20 секунд не один гигабайт памяти скопировать можно.

          Да, а чем просто measuresvector2 = measuresvector не устраивает ??
            jack128, тут штото нетак! Но ТС не озвучивает предпосылов :-?
              Цитата erslgoeirjh @
              ... Этот вектор имеет 40 тысяч таких элементов.
              Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код:

              Этот процесс копирования занимает 20 секунд.

              Что-то не так. "Не верю" ©
              20[c] = 20000[mc]
              20000 / 40000 = 0.5[mc]/объект.
              И каких же размеров объект ?!!
              Если он 100500 триллионов мегабайт то возможно.
              Но вообще скорость получилась невероятно медленная.
              ---
              Можно попробовать простой тест - копировать массивы в стиле "С"
              указанного размера. Быстрее не будет.
                Цитата ЫукпШ @
                Можно попробовать простой тест - копировать массивы в стиле "С"
                указанного размера. Быстрее не будет.

                Цитата JoeUser @
                и использовать std::memcpy для копирования

                да-да-да :)
                  Цитата ЫукпШ @
                  Если он 100500 триллионов мегабайт то возможно.
                  Целевой вектор изначально пуст, не зря же третьим параметром идёт std::back_insert_iterator<>, поэтому вектор делает 100500 перераспределений. std::vector<>::reserve() решает проблему.
                  Цитата JoeUser @
                  да-да-да
                  std::copy() для POD и так способен сделать такую оптимизацию.
                    Цитата Qraizer @
                    для POD

                    Переход на POD, думаю, для ТС будет одним из решений.
                      Цитата JoeUser @
                      Переход на POD, думаю, для ТС будет одним из решений.

                      я попробовал сделать тест - просто интересно.
                      Два массива в стиле С (из некоторых структур) размером 24000000 итемов
                      копируются друг в друга. Общий размер каждого - 750М.
                      Истачена вся память компа, приблизительно 10-летней старости.
                      Время копирования около 500-550 [мс].
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0653 ]   [ 17 queries used ]   [ Generated: 20.04.24, 00:50 GMT ]