Копирование вектора (std::vector)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.10.19 11:41
Оценка: :))) :))) :)))
Есть некоторая структура 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 секунд.

Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?
1613 г. = 2024 г.
Re: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 28.10.19 11:50
Оценка: +4
Здравствуйте, RussianFellow, Вы писали:

RF>Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?

зарезервировать 40 тыс. элементов — при помощи метода my_vector.reserve(40000);

UPD:
measuresvector2.reserve(measuresvector.size()); // Резервируем под вектор необходимый размер
std::back_insert_iterator<std::vector <Measure_Simulation> >  toV(measuresvector2);
std::copy(measuresvector.begin(),measuresvector.end(),toV);
Третий Рим должен пасть!
Отредактировано 28.10.2019 11:52 GhostCoders . Предыдущая версия .
Re[2]: Копирование вектора (std::vector)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.10.19 11:55
Оценка: +1 -1 :))) :))
А зачем нужно резервирование элементов?
1613 г. = 2024 г.
Re: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 11:57
Оценка: 5 (2) +7 :)
Здравствуйте, RussianFellow, Вы писали:

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

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

RF>Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?


Можно. Для этого нужно использовать такой код:

measurevector2 = measurevector;


Следующим шагом можно подумать, а действительно ли здесь необходимо копирование. Если окажется, что вместо копирования подходит перемещение, то время сведется вообще к нулю.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 28.10.2019 12:19 rg45 . Предыдущая версия .
Re[3]: Копирование вектора (std::vector)
От: LaptevVV Россия  
Дата: 28.10.19 12:04
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>А зачем нужно резервирование элементов?

Чтобы во время копирования не резервировалась память и не выполнялось копирование "под капотом"
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 28.10.19 12:07
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>А зачем нужно резервирование элементов?

Все реализации вектора должны хранить свои элементы последовательно в памяти.
Условно говоря, изначально вектор в конструкторе выделяет память на N элементов, где N — небольшое число (обычно 8-16 элементов).
После заполнения этой памяти, вектор выделяет память в два раза больше (или всего лишь на 10% больше) и копирует туда элементы из старого массива в новый.
Старый массив удаляет. Когда у тебя 40 тыс. элементов добавятся таких реаллокаций будет множество — из-за них и тормозит.

Это такой std::vector. Из-за требования хранить все элементы рядом друг с другом. std::list от такого недостатка свободен, но у него есть накладные расходы по памяти.
Третий Рим должен пасть!
Re[2]: Копирование вектора (std::vector)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.10.19 12:16
Оценка:
Здравствуйте, rg45, Вы писали:

R>Можно. Для этого нужно использовать такой код:

R>
R>measurevector2 = measurevector;
R>


Ясно.

И ещё вопрос: как лучше всего добавить содержимое вектора measuresvector в конец вектора measuresvector2 ?
Есть код:

measurevector2.reserve(measuresvector2.size()+measuresvector.size());
measuresvector2.insert(measuresvector2.end(),measuresvector.begin(),measuresvector.end());


Можно ли изменить этот код, чтобы он работал быстрее? Что для этого нужно сделать?
1613 г. = 2024 г.
Re[3]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 12:24
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>И ещё вопрос: как лучше всего добавить содержимое вектора measuresvector в конец вектора measuresvector2 ?

RF>Есть код:

RF>
RF>measurevector2.reserve(measuresvector2.size()+measuresvector.size());
RF>measuresvector2.insert(measuresvector2.end(),measuresvector.begin(),measuresvector.end());
RF>


RF>Можно ли изменить этот код, чтобы он работал быстрее? Что для этого нужно сделать?


Это, пожалуй, самый прямой путь, тут уж вряд ли что-то можно улучшить.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Копирование вектора (std::vector)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 28.10.19 12:30
Оценка: 2 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>
RF>measurevector2.reserve(measuresvector2.size()+measuresvector.size());
RF>measuresvector2.insert(measuresvector2.end(),measuresvector.begin(),measuresvector.end());
RF>


RF>Можно ли изменить этот код, чтобы он работал быстрее? Что для этого нужно сделать?


Если ядер много, то как-то так:
size_t size1 = measurevector1.size();
size_t size2 = measurevector2.size();
size_t new_size = size1 + size2;
measurevector2.resize(new_size);
#pragma omp parallel for
for (size_t i = 0; i < size1; ++i)
{
    measurevector2[size2 + i] = measurevector1[i];
}
Re[3]: Копирование вектора (std::vector)
От: AleksandrN Россия  
Дата: 28.10.19 12:33
Оценка: +3
Здравствуйте, RussianFellow, Вы писали:

RF>Здравствуйте, rg45, Вы писали:


R>>Можно. Для этого нужно использовать такой код:

R>>
R>>measurevector2 = measurevector;
R>>


RF>Ясно.


RF>И ещё вопрос: как лучше всего добавить содержимое вектора measuresvector в конец вектора measuresvector2 ?

RF>Есть код:

RF>
RF>measurevector2.reserve(measuresvector2.size()+measuresvector.size());
RF>measuresvector2.insert(measuresvector2.end(),measuresvector.begin(),measuresvector.end());
RF>


RF>Можно ли изменить этот код, чтобы он работал быстрее? Что для этого нужно сделать?


Зачем понадобилось два вектора? Напиши логику работы с ними.
Может быть вместо этого хранить всё в одном векторе и сделать обёртку, которая будет обращаться к нужному участку вектора? Или сделать список векторов.
Re[4]: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 28.10.19 12:47
Оценка: 2 (1)
Здравствуйте, Nuzhny, Вы писали:

N>#pragma omp parallel for

Тут особо выигрыша не будет. Так как здесь не CPU узкое место, а пропускная способность памяти (RAM).
В память может и упрется.
Третий Рим должен пасть!
Re: [KУ] Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 13:13
Оценка: :)))
Здравствуйте, RussianFellow, Вы писали:

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


Копирование std::vector глазами разработчика _обычного_ языка программирования:

--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Копирование вектора (std::vector)
От: AleksandrN Россия  
Дата: 28.10.19 13:26
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, Nuzhny, Вы писали:


N>>#pragma omp parallel for

GC>Тут особо выигрыша не будет. Так как здесь не CPU узкое место, а пропускная способность памяти (RAM).
GC>В память может и упрется.

Ещё взглянуть бы на конструктор копии Measure_Simulation, может быть он тоже медленный. По описанию "много полей типа int, long, long double, char*, bool") сильно тормозить не должен, но вдруг там гигабайты этих полей.
Re[2]: [KУ] Копирование вектора (std::vector)
От: AleksandrN Россия  
Дата: 28.10.19 13:28
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Копирование std::vector глазами разработчика _обычного_ языка программирования:


R>Img.


Чем обычный язык программирования отличается от необычного?
Re[3]: [KУ] Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 13:34
Оценка:
Здравствуйте, AleksandrN, Вы писали:

R>>Копирование std::vector глазами разработчика _обычного_ языка программирования:

R>>Img.

AN>Чем обычный язык программирования отличается от необычного?


Таки нашелся тот, кто заставил объяснять шутку. Ну, допустим, НЕ обычный — это C++. Соответственно, любой язык, отличный от С++ — обычный. Как тебе такая версия?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Копирование вектора (std::vector)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 28.10.19 13:41
Оценка:
Здравствуйте, GhostCoders, Вы писали:

N>>#pragma omp parallel for

GC>Тут особо выигрыша не будет. Так как здесь не CPU узкое место, а пропускная способность памяти (RAM).
GC>В память может и упрется.

Набросал тест с POD структурой на своём 6-ядерном ноуте и параллельная версия получилась процентов на 10 быстрее. Согласен, что на маленьких данных выигрыша особого не будет. Но на больших объёмах он вполне возможен, почему нет? Особенно если много памяти занимает и она многоканальная.
Re[6]: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 28.10.19 13:55
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Набросал тест с POD структурой на своём 6-ядерном ноуте и параллельная версия получилась процентов на 10 быстрее. Согласен, что на маленьких данных выигрыша особого не будет. Но на больших объёмах он вполне возможен, почему нет? Особенно если много памяти занимает и она многоканальная.

10 процентов єто как раз "особого віигріша не будет"
Третий Рим должен пасть!
Re[4]: [KУ] Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 28.10.19 13:58
Оценка:
Здравствуйте, rg45, Вы писали:

R>Таки нашелся тот, кто заставил объяснять шутку. Ну, допустим, НЕ обычный — это C++. Соответственно, любой язык, отличный от С++ — обычный. Как тебе такая версия?

В єтой ветке ожидается 200+ сообщений.
Третий Рим должен пасть!
Re[4]: [KУ] Копирование вектора (std::vector)
От: AleksandrN Россия  
Дата: 28.10.19 14:24
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, AleksandrN, Вы писали:


R>>>Копирование std::vector глазами разработчика _обычного_ языка программирования:

R>>>Img.

AN>>Чем обычный язык программирования отличается от необычного?


R>Таки нашелся тот, кто заставил объяснять шутку. Ну, допустим, НЕ обычный — это C++. Соответственно, любой язык, отличный от С++ — обычный. Как тебе такая версия?


Тогда прыгун должен прыгать в чёрном полупрозрачном ящике. Степень прозрачности зависит от необычности языка. Чем необычней тем прозрачней.
Re[5]: [KУ] Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 14:30
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Тогда прыгун должен прыгать в чёрном полупрозрачном ящике. Степень прозрачности зависит от необычности языка. Чем необычней тем прозрачней.


Слишком сложная шутка. Для меня это некст левел.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: [KУ] Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 28.10.19 14:31
Оценка: :))
Здравствуйте, GhostCoders, Вы писали:

GC>В єтой ветке ожидается 200+ сообщений.


Так и задумано
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Копирование вектора (std::vector)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.10.19 14:32
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это, пожалуй, самый прямой путь, тут уж вряд ли что-то можно улучшить.


Ясно, понял. Спасибо!
1613 г. = 2024 г.
Re[6]: [KУ] Копирование вектора (std::vector)
От: AleksandrN Россия  
Дата: 28.10.19 14:51
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, AleksandrN, Вы писали:


AN>>Тогда прыгун должен прыгать в чёрном полупрозрачном ящике. Степень прозрачности зависит от необычности языка. Чем необычней тем прозрачней.


R>Слишком сложная шутка. Для меня это некст левел.


Значит показано копирование std::vector глазами разработчика на ассемблере или Си. Для них всё прозрачно и кажется излишними выкрутасами
Re: Копирование вектора (std::vector)
От: ArtDenis Россия  
Дата: 28.10.19 15:02
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Можно ли как-то сделать это копирование быстрее?

Да

RF>Какой код для этого следует использовать?

Профайлер
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Копирование вектора (std::vector)
От: XOOIOOX  
Дата: 28.10.19 16:17
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

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


Re: Копирование вектора (std::vector)
От: 3V Россия  
Дата: 28.10.19 20:41
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?


Да.
Сделать Measure_Simulation implicitly shared class-ом (копирование при неконстантном доступе).
По сути, это pimpl + подсчет ссылок на атомиках (если код не многопоточный, то можно и не на атомиках).
Или использовать shared_ptr, если нужно совместное владение.
Или использовать unique_ptr, если не нужно.
Или использовать что-то типа QSharedDataPointer, boost::intrusive_ptr.

Отредактировано 28.10.2019 20:44 3V . Предыдущая версия .
Re[2]: Копирование вектора (std::vector)
От: Basil2 Россия https://starostin.msk.ru
Дата: 29.10.19 12:53
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

GC>зарезервировать 40 тыс. элементов — при помощи метода my_vector.reserve(40000);


GC>
GC>measuresvector2.reserve(measuresvector.size()); // Резервируем под вектор необходимый размер
GC>std::back_insert_iterator<std::vector <Measure_Simulation> >  toV(measuresvector2);
GC>std::copy(measuresvector.begin(),measuresvector.end(),toV);
GC>


Разве copy не сделает этого автоматически? Это же интервальная функция, она должна понимать размер коипируемого. По идее, трейты в шаблонах вполне позволяют понять тип итератора, вычислить длину и зарезервить.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[3]: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 29.10.19 12:56
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Разве copy не сделает этого автоматически? Это же интервальная функция, она должна понимать размер коипируемого. По идее, трейты в шаблонах вполне позволяют понять тип итератора, вычислить длину и зарезервить.

Хороший вопрос. Но, как говорится, доверяй, но проверяй.
Третий Рим должен пасть!
Re[3]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 29.10.19 13:15
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Разве copy не сделает этого автоматически? Это же интервальная функция, она должна понимать размер коипируемого. По идее, трейты в шаблонах вполне позволяют понять тип итератора, вычислить длину и зарезервить.


Нет конечно. Copy занимается только копированием, такова семантика алгоритма. И в качестве назначения копирования ему передается не весь контейнер, а только итератор (который может оказаться простым указателем). И о том, чтобы этот итератор не вышел за дозволенные пределы, должна позаботиться вызывающая функция.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 29.10.2019 13:52 rg45 . Предыдущая версия . Еще …
Отредактировано 29.10.2019 13:23 rg45 . Предыдущая версия .
Отредактировано 29.10.2019 13:18 rg45 . Предыдущая версия .
Re[4]: Копирование вектора (std::vector)
От: swingus  
Дата: 29.10.19 18:53
Оценка:
С range'ами и концептами, наверное, будет так. Потому как появился концепт SizedRange.

Здравствуйте, rg45, Вы писали:

R>Нет конечно. Copy занимается только копированием, такова семантика алгоритма. И в качестве назначения копирования ему передается не весь контейнер, а только итератор (который может оказаться простым указателем). И о том, чтобы этот итератор не вышел за дозволенные пределы, должна позаботиться вызывающая функция.
Re[5]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 29.10.19 19:01
Оценка:
Здравствуйте, swingus, Вы писали:

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


S>С range'ами и концептами, наверное, будет так. Потому как появился концепт SizedRange.


Как, имея один только простой указатель, алгоритм copy может прийти к выводу, что это этот указатель — итератор вектора? А потом найти этот вектор и модифицировать его. Расскажешь?

P.S. И как быть с инвалидацией итераторов при переаллокации — это будет следующий вопрос.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 29.10.2019 19:29 rg45 . Предыдущая версия . Еще …
Отредактировано 29.10.2019 19:08 rg45 . Предыдущая версия .
Отредактировано 29.10.2019 19:06 rg45 . Предыдущая версия .
Отредактировано 29.10.2019 19:06 rg45 . Предыдущая версия .
Re: Копирование вектора (std::vector)
От: kov_serg Россия  
Дата: 29.10.19 21:05
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool.

слешка настораживают типы char*

RF>И есть вектор (std::vector) measuresvector, каждый элемент которого относится к типу Measure_Simulation. Этот вектор имеет 40 тысяч таких элементов.


RF>Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код:

данная структура имеет свой оператор копирования или по умолчанию просто копирует все поля как быйты?

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

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

RF>Можно ли как-то сделать это копирование быстрее?

А чему равно sizeof(Measure_Simulation)*40000шт/20сек = ?
Если это < 40Gb/sec то можно ускорять.
RF>Какой код для этого следует использовать?
memcpy
Re[6]: Копирование вектора (std::vector)
От: swingus  
Дата: 30.10.19 17:42
Оценка: :)
Ну, вам нужно ещё многому учиться. Сейчас std::copy() принимает пару итераторов и range в std::ranges::copy(). Причём здесь инвалидация при переаллокации, если не происходит копирование контейнера самого в себя, я не знаю.

Здравствуйте, rg45, Вы писали:

R>Как, имея один только простой указатель, алгоритм copy может прийти к выводу, что это этот указатель — итератор вектора? А потом найти этот вектор и модифицировать его. Расскажешь?


R>P.S. И как быть с инвалидацией итераторов при переаллокации — это будет следующий вопрос.
Re[7]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 30.10.19 17:54
Оценка:
Здравствуйте, swingus, Вы писали:

S>Ну, вам нужно ещё многому учиться. Сейчас std::copy() принимает пару итераторов и range в std::ranges::copy(). Причём здесь инвалидация при переаллокации, если не происходит копирование контейнера самого в себя, я не знаю.


Ну так с этого и надо было начинать. Сылочку можно?

[Upd]: Нашел: https://en.cppreference.com/w/cpp/ranges.

На CppCon об этом говорили. Я собирался посмотреть, да руки все не доходили.

Спасибо, посмотрю.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 30.10.2019 17:57 rg45 . Предыдущая версия .
Re[7]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 30.10.19 18:37
Оценка:
Здравствуйте, swingus, Вы писали:

S>Ну, вам нужно ещё многому учиться. Сейчас std::copy() принимает пару итераторов и range в std::ranges::copy(). Причём здесь инвалидация при переаллокации, если не происходит копирование контейнера самого в себя, я не знаю.


Безуспешно пытаюсь найти описанную тобой версию copy. Я уточню, ты точно знаешь, что такая версия будет, или предполагаешь, что такое такое теоретически возможно?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: Копирование вектора (std::vector)
От: AndrewJD США  
Дата: 30.10.19 20:28
Оценка: 18 (1)
Здравствуйте, rg45, Вы писали:


S>>Ну, вам нужно ещё многому учиться. Сейчас std::copy() принимает пару итераторов и range в std::ranges::copy(). Причём здесь инвалидация при переаллокации, если не происходит копирование контейнера самого в себя, я не знаю.

R>Безуспешно пытаюсь найти описанную тобой версию copy. Я уточню, ты точно знаешь, что такая версия будет, или предполагаешь, что такое такое теоретически возможно?

Да не ищи, нет такой.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[9]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 30.10.19 20:31
Оценка:
Здравствуйте, AndrewJD, Вы писали:

S>>>Ну, вам нужно ещё многому учиться. Сейчас std::copy() принимает пару итераторов и range в std::ranges::copy(). Причём здесь инвалидация при переаллокации, если не происходит копирование контейнера самого в себя, я не знаю.


R>>Безуспешно пытаюсь найти описанную тобой версию copy. Я уточню, ты точно знаешь, что такая версия будет, или предполагаешь, что такое такое теоретически возможно?


AJD>Да не ищи, нет такой.


Ну вот, а я только настроился _многому_научиться_
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 30.10.2019 20:46 rg45 . Предыдущая версия .
Re[10]: Копирование вектора (std::vector)
От: AndrewJD США  
Дата: 30.10.19 20:46
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Ну вот, а я только настроился _многому_учиться_


Еще все впереди
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[8]: Копирование вектора (std::vector)
От: swingus  
Дата: 31.10.19 05:10
Оценка: :)
Ну, скажем, в майкрософтовской STL (да и в других, наверное) есть специализация std::copy() для POD типов, где сразу вызывается std::memcpy(), так что я не вижу причин, чтобы не было оптимизации для рэнджей с известным размером и последовательно расположенными элементами.

Здравствуйте, rg45, Вы писали:

R>Безуспешно пытаюсь найти описанную тобой версию copy. Я уточню, ты точно знаешь, что такая версия будет, или предполагаешь, что такое такое теоретически возможно?
Re[9]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 31.10.19 06:22
Оценка:
Здравствуйте, swingus, Вы писали:

R>>Безуспешно пытаюсь найти описанную тобой версию copy. Я уточню, ты точно знаешь, что такая версия будет, или предполагаешь, что такое такое теоретически возможно?


S>Ну, скажем, в майкрософтовской STL (да и в других, наверное) есть специализация std::copy() для POD типов, где сразу вызывается std::memcpy(), так что я не вижу причин, чтобы не было оптимизации для рэнджей с известным размером и последовательно расположенными элементами.


Это принципиально разные задачи. Для оптимизации копирования POD-типов доступ к контейнеру не требуется. А для изменения размера контейнера требуется доступ к этому контейнеру. А для этого должна существовать версия функции, которая принимает range (именно range, а не итератор). А где эта функция, она сущетвует в природе? В этом же был вопрос.

Я еще на всякий случай хочу уточнить, ты понимаешь, что НА ИМЕЮЩИХСЯ вариантах задача изменения размера контейнера во время копирования не решаема? Или не понимаешь?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 31.10.2019 8:21 rg45 . Предыдущая версия . Еще …
Отредактировано 31.10.2019 6:57 rg45 . Предыдущая версия .
Отредактировано 31.10.2019 6:51 rg45 . Предыдущая версия .
Отредактировано 31.10.2019 6:48 rg45 . Предыдущая версия .
Отредактировано 31.10.2019 6:35 rg45 . Предыдущая версия .
Отредактировано 31.10.2019 6:32 rg45 . Предыдущая версия .
Re[7]: Копирование вектора (std::vector)
От: pagid Россия  
Дата: 31.10.19 08:52
Оценка:
Здравствуйте, GhostCoders, Вы писали:

N>>Набросал тест с POD структурой на своём 6-ядерном ноуте и параллельная версия получилась процентов на 10 быстрее. Согласен, что на маленьких данных выигрыша особого не будет. Но на больших объёмах он вполне возможен, почему нет? Особенно если много памяти занимает и она многоканальная.

GC>10 процентов єто как раз "особого віигріша не будет"
Переехал таки в Полтаву? Или на родине завел себе клавиатуру без "ы", но с "є"
Re[8]: Копирование вектора (std::vector)
От: GhostCoders Россия  
Дата: 31.10.19 08:55
Оценка:
Здравствуйте, pagid, Вы писали:

P>Переехал таки в Полтаву? Или на родине завел себе клавиатуру без "ы", но с "є"

Клавиатуру завел.
Третий Рим должен пасть!
Re[9]: Копирование вектора (std::vector)
От: pagid Россия  
Дата: 31.10.19 09:05
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Клавиатуру завел.

Поздравляю. Но да, каждый деградирует несчастен по своему.
Re[10]: Копирование вектора (std::vector)
От: swingus  
Дата: 01.11.19 02:02
Оценка:
Ну, возможно, тебе приходило такое в голову, что ranges-v3 оперирует рэнжами? И, может быть, ты слышал, что её включили в C++ 20?

Здравствуйте, rg45, Вы писали:

R>Это принципиально разные задачи. Для оптимизации копирования POD-типов доступ к контейнеру не требуется. А для изменения размера контейнера требуется доступ к этому контейнеру. А для этого должна существовать версия функции, которая принимает range (именно range, а не итератор). А где эта функция, она сущетвует в природе? В этом же был вопрос.


R>Я еще на всякий случай хочу уточнить, ты понимаешь, что НА ИМЕЮЩИХСЯ вариантах задача изменения размера контейнера во время копирования не решаема? Или не понимаешь?
Re: Копирование вектора (std::vector)
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 01.11.19 02:13
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool.

RF>И есть вектор (std::vector) measuresvector, каждый элемент которого относится к типу Measure_Simulation. Этот вектор имеет 40 тысяч таких элементов.
RF>Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код:

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

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

RF>Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?


Если "достаточно много полей" — это не миллионы, то проблема явно не в приведённой строке.
Ce n'est que pour vous dire ce que je vous dis.
Re[11]: Копирование вектора (std::vector)
От: rg45 СССР  
Дата: 01.11.19 07:14
Оценка:
Здравствуйте, swingus, Вы писали:

S>Ну, возможно, тебе приходило такое в голову, что ranges-v3 оперирует рэнжами? И, может быть, ты слышал, что её включили в C++ 20?


Вообще, мне много всего приходило и продолжает приходить в голову. Но почему бы тебе просто не ответить на вопрос
Автор: rg45
Дата: 30.10.19
?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[12]: Копирование вектора (std::vector)
От: swingus  
Дата: 01.11.19 18:56
Оценка:
Да, алгоритмов, принимающих контейнер, в ranges v3 нет. Я был неправ. Единственное, что меня частично извиняет, это то, что в boost.ranges v2 такие алгоритмы есть — push_back(), push_front() & insert().

Здравствуйте, rg45, Вы писали:

R>Вообще, мне много всего приходило и продолжает приходить в голову. Но почему бы тебе просто не ответить на вопрос
Автор: rg45
Дата: 30.10.19
?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.