Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 2
Регистрация: 04.12.2016
Сообщений: 165

Разница в скорости работы memcpy для std::vector и raw pointer

19.06.2024, 10:33. Показов 2446. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Во время тестов заметил, что memcpy для std::vector выполняется быстрее, чем для сырого указателя, решил поподробнее это протестировать. Привожу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    size N = 256*256;
 
    // std vector
    std::vector<float> in_v(Q*L);
    std::vector<float> out_v(Q*L);
 
    // restricted raw pointer
    float* __restrict__ in_rp  = new float[Q*L];
    float* __restrict__ out_rp = new float[Q*L];
 
    // raw pointer
    float* in_p  = new float[Q*L];
    float* out_p = new float[Q*L];
 
    // пытаюсь забить все кэши данными
    std::vector<float> dump(_L3_size_*4);
    for(auto it = dump.begin(); it != dump.end(); it++) { *it = 1.2; }
 
    std::vector<std::pair<std::string, double>> time;
 
    for(int i = 0; i < 3; ++i) {
      
        time.push_back(std::make_pair("memcpy float*", omp_get_wtime()));
        memcpy(out_p, in_p, sizeof(float)*size);
        time.back().second = omp_get_wtime() - time.back().second;
 
        time.push_back(std::make_pair("memcpy rstr*", omp_get_wtime()));
        memcpy(out_rp, in_rp, sizeof(float)*size);
        time.back().second = omp_get_wtime() - time.back().second;
 
        time.push_back(std::make_pair("memcpy vector", omp_get_wtime()));
        memcpy(out_v.data(), in_v.data(), sizeof(float)*size);
        time.back().second = omp_get_wtime() - time.back().second;
 
        for(auto calc : time) {
            std::cout << calc.first << "\ttime = "  << calc.second << std::endl;
        }
        time.clear();
 
        std::cout << std::endl;
    }
В итоге получилась следующая картина: для первого прогона (когда данные вне КЭШа)
memcpy float* time = 0.00882006
memcpy rstr* time = 0.00874019
memcpy vector time = 0.00342417

А для следующих двух вот так

memcpy float* time = 0.00222993
memcpy rstr* time = 0.00216913
memcpy vector time = 0.00342107

memcpy float* time = 0.00222898
memcpy rstr* time = 0.00218987
memcpy vector time = 0.00340581

То есть можно сделать вывод, что std::vector как-то грамотнее использует каналы DDR, данные качаются быстрее, чем через сырые указатели. Однако, когда данные кэшированы, вектор работает хуже. Правильны ли мои выводы и что же это за особенность реализации std::vector, которая позволяет эму так выигрывать в скорости?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2024, 10:33
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Тестирование скорости обычного std::vector на x86, x64 Windows
Здравствуйте, Что не так ?? int vector_test(std::vector&lt;int&gt;&amp; vec_result, size_t numer) { vec_result.resize(0); ...

Выделение памяти для вектора std::vector<iris> *v = new std::vector<iris>
Можно ли создать вектор, выделить для него память, так что бы он &quot;жил&quot; до конца работы программы. иметь на него постоянную...

30
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.06.2024, 12:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от crazymadman18 Посмотреть сообщение
была задача оценить пиковую пропускную для полностью неКэшированных и полностью Кэшированных данных, так что я пытался как-то это смоделировать.
Определяйте размер кеша, и подавайте различные участки памяти, какое угодно количество раз, они не будут кешированы.
Плюс, не храните эти данные последовательно, выделите все куски динамически, то ли через new или вектор.

То есть, ваш тест абсолютно не показателен.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
19.06.2024, 12:32
Цитата Сообщение от crazymadman18 Посмотреть сообщение
так что приходится очень сильно изолировать задачу от глобального проекта.
Ну тогда нужно всегда держать в голове, что результаты этой изоляции могут разойтись с реальностью.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.06.2024, 23:29
Цитата Сообщение от DrOffset Посмотреть сообщение
Это только при доступе к _значению_ будет UB. Вот если бы он через std::copy копировал, то тогда да, было бы UB.
Не было бы.
Или я чего то не знаю ?
УБ нет при неинциализированных данных, как я раньше писал, оно будет тольео при логическом использовании тех самых данных.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.06.2024, 00:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Или я чего то не знаю ?
Наверняка.
Что такое UB по-вашему?

Добавлено через 27 минут
Ждал, ждал... Хотел развить диалог, но лень дальше ждать ответа.

В общем. Это будет не UB только в C++26. Там это будет erroneous behavior. Я тут уже когда-то говорил, что комитет старается сокращать число UB, которые сложно проявить на практике. Так что это ожидаемо.
А пока, до этого момента подобный код 20 c лишним лет считался кодом с UB. За исключением операций с типом char и байтами, работы с memcpy и т.п.
C++
1
2
double a;
double b = a; // undefined behaviour до C++26, в C++26 - erroneous behavior
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.06.2024, 00:21
Цитата Сообщение от DrOffset Посмотреть сообщение
double a;
double b = a; // undefined behaviour
Что совсем совсем УБ, или только с точки логики ?

Цитата Сообщение от DrOffset Посмотреть сообщение
Что такое UB по-вашему?
УБ это когда код не может однозначно отреагировать на запрос (поведение определенное пользователм).
То есть, чем глубже УБ тем непредсказуемый результат.

УБ высшего уровня, на уровне пользователя, тот же выход за пределы массива,, это не УБ вовсе.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.06.2024, 00:28
Пошел поискать для вас понятный источник про это нововведение и нашел золото:
В P2795 ввели понятие erroneous behavior — поведение, которое рекомендуется диагностировать компиляторам, которое запрещено в constexpr-контекстах и которое является последствием ошибки в коде. Таким поведением сделали работу с неинициализированной переменной, например:
C++
1
2
3
4
5
6
void fill(int&);
 
void sample() {
  int x;
  fill(x);     // ошибочное поведение (erroneous behavior)
}
Поведение компилятора при erroneous behavior определено. Другими словами, комитет идёт к уменьшению количества Undefined Behavior в C++, чётко описывая, что происходит в том или ином случае, чтобы мотивировать компиляторы диагностировать подобные ошибки и при этом не увеличивать время выполнения приложения.
Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
УБ это когда код не может однозначно отреагировать на запрос (поведение определенное пользователм).
То есть, чем глубже УБ тем непредсказуемый результат.
УБ высшего уровня, на уровне пользователя, тот же выход за пределы массива,, это не УБ вовсе.
Ну вот ваше понимание расходится с официальным. Код с UB - это в первую очередь код, для которого отсутствуют гарантии со стороны спецификации C++. UB не означает само по себе, что код будет обязательно не работать, или работать непредсказуемо. Но спецификация не может (или не хочет, в некоторых случаях) гарантировать (определить) его работу. Именно поэтому оно и неопределенное. Поговорка даже такая есть "корректное выполнение программы - это частный случай неопределенного поведения".

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Что совсем совсем УБ, или только с точки логики ?
UB может быть только с точки зрения стандарта C++
Это термин юридический для обозначения ситуаций в коде, для которых нет формальных гарантий.
0
фрилансер
 Аватар для Алексей1153
6509 / 5768 / 1135
Регистрация: 11.10.2019
Сообщений: 15,408
20.06.2024, 08:05
Цитата Сообщение от DrOffset Посмотреть сообщение
erroneous behavior
то есть, EB ,
Кликните здесь для просмотра всего текста
ЁБ
, наконец-то всё названо своими словами

Цитата Сообщение от DrOffset Посмотреть сообщение
Что такое UB по-вашему
в случае UB компилятору позволено сделать что угодно. Например, позвонить в полицию Шутка. Почти

Но обычно компилятор, если UB заметил, просто сделает так, что этот участок не будет выполнен - так, на всякий случай
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.06.2024, 09:08
Алексей1153, ну реакция компилятора (в том числе звонок в полицию, запуск игры, или баллистической ракеты) - это просто следствие отсутствия гарантий от стандарта. Т.е. официальный документ в этом случае умыл руки. А компилятор может вообще ничего не делать в этой ситуации - ничего не обнаруживать, ничего не обрабатывать.
0
фрилансер
 Аватар для Алексей1153
6509 / 5768 / 1135
Регистрация: 11.10.2019
Сообщений: 15,408
20.06.2024, 09:11
DrOffset, это я больше про беспечность SmallEvil. Как-то он легко относится к UB. Я вот везде пытаюсь рассмотреть, потому что это больно
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.06.2024, 09:18
Алексей1153, я думаю он нормально относится, только вот почему-то он считал за UB только какие-то спецэффекты. Связывать UB со спецэффектами - это все равно что связывать нарушение правил дорожного движения с аварией. Не любое нарушение будет приводить к авариям или штрафам, но от того, что кто-то втихаря перебежал дорогу на красный и никто этого не заметил и никто не пострадал, нарушение правил не перестанет быть нарушением правил.

Почему программисты реагируют на UB? Не потому что оно всегда будет приводить к авариям, а потому что оно может привести к аварии. Вот это вот "может" совершенно недопустимо в серьезной разработке, потому что вносит дополнительный фактор риска в продукт. В серьезных делах факторы риска разумно будет минимизировать, даже если они кажутся маловероятными.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
22.06.2024, 07:24
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Но обычно компилятор, если UB заметил
Нет, компилятор всегда считает, что программист пишет код без UB, и ни про какие UB он знать не знает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2024, 07:24

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь заполнить его объектами класса...

Как лучше организовать доступ к std::vector<std::vector>-полю класса
Допустим, есть такой класс: class Class { private: std::vector &lt;std::vector &lt;Type&gt;&gt; vec2d; // Или, например,...

Проверить, есть ли элементы std::vector A в std::vector B
Проверить, есть ли элементы std::vector A в std::vector B: Основной класс создаёт вектор имён модулей, которые он хочет...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru