У меня копируется один массив в другой (его размер под 2 метра).
Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
RI,
> У меня копируется один массив в другой (его размер под 2 метра). > Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, RI, Вы писали:
RI>У меня копируется один массив в другой (его размер под 2 метра). RI>Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
Если массив POD-типов, то быстрее не будет, а если не POD-типов, то будет веселее
А если серьёзно, то я думаю, что скорость копирования большого блока памяти всё равно упрётся в скорость работы с памятью. memcpy просто нечего предложить принципиально нового по сравнению с циклом копирования. Т.е. если грамотно написать цикл копирования (без лишних операций), то скорость его выполнения будет не на много отличаться.
Хотя всё таки разумнее использовать memcpy как минимум по двум причинам. Первая — её реализацию скорее всего соптимизировали на уровне ассемблера. Вторая — код будет более читабельным, т.к. сразу будет понятно что что-то копируется, а не просто цикл, а так же понятно что, куда и сколько.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>RI,
>> У меня копируется один массив в другой (его размер под 2 метра). >> Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
ПК>Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?
Тип мой собственный структура из 2 полей : перечисление и double;
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>RI,
>> У меня копируется один массив в другой (его размер под 2 метра). >> Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
ПК>Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?
В каком, например, случае копирование с помощью memcpy может быть медленее, чем в цикле? Если, конечно размер блока большой. Это всё таки библиотечная функция копирования.
remark wrote:
> А если серьёзно, то я думаю, что скорость копирования большого блока памяти всё равно упрётся в скорость работы с памятью. memcpy просто нечего предложить принципиально нового по сравнению с циклом копирования. Т.е. если грамотно написать цикл копирования (без лишних операций), то скорость его выполнения будет не на много отличаться.
У меня есть сильное подозрение, что Intel C++ compiler for Linux разворачивает memcpy в mmx/sse, т.к. скорости рукописного цикла и memcpy gcc на моих тестах были в 3 раза меньше. Сглупил кода тестировал — не посмотрел asm output.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, RI, Вы писали:
RI>>Тип мой собственный структура из 2 полей : перечисление и double;
AD>Приведи полностью описание твоей структуры.
По-моему я довольно точно сказал. Ну если надо, пожалуйста
Здравствуйте, RI, Вы писали:
RI>У меня копируется один массив в другой (его размер под 2 метра). RI>Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
RI>У меня копируется один массив в другой (его размер под 2 метра). RI>Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
Полевые испытания на MS VC.2003 для массивов POD-типов показали:
1) при компиляции с оптимизацией по скорости или с полной оптимизацией (Maximize Speed (/O2) или Full Optimization (/Ox)) и memcpy и копирование в цикле разворачивается в банальный rep movsd;
2) при компиляции с оптимизацией по объёму (Minimize Size (/O1)) копирование в цикле заменяется rep movsd, а вот memcpy так и остаётся вызовом memcpy (call _memcpy);
3) с отключенной оптимизацией имеем то, что и ожидаем — явный цикл и явный вызов _memcpy..
Выводы делайте сами... У меня напрашивается лишь один: во втором случае возможно memcpy окажется медленнее — но это только предположение, в данный момент у меня не поставлено ни одного профилировщика, поэтому оценить скорость не могу ...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
PS: Разумеется электронная версия выложена в ознакомительных целях и подразумевает дальнейшую покупку своего легального бумажного собрата
Преимущества бумажной версии думаю перечислять не стоит
ME>У меня есть сильное подозрение, что Intel C++ compiler for Linux разворачивает memcpy в mmx/sse, т.к. скорости рукописного цикла и memcpy gcc на моих тестах были в 3 раза меньше. Сглупил кода тестировал — не посмотрел asm output.
Скорее она использует DMA если размер блока большой...
Здравствуйте, remark, Вы писали:
R>Если массив POD-типов, то быстрее не будет, а если не POD-типов, то будет веселее
R>А если серьёзно, то я думаю, что скорость копирования большого блока памяти всё равно упрётся в скорость работы с памятью. memcpy просто нечего предложить принципиально нового по сравнению с циклом копирования. Т.е. если грамотно написать цикл копирования (без лишних операций), то скорость его выполнения будет не на много отличаться.
R>Хотя всё таки разумнее использовать memcpy как минимум по двум причинам. Первая — её реализацию скорее всего соптимизировали на уровне ассемблера. Вторая — код будет более читабельным, т.к. сразу будет понятно что что-то копируется, а не просто цикл, а так же понятно что, куда и сколько. R>
Еще memcpy знает про то, что нужно делать, если копируются невыровненные данные на тех архитектурах, где это крайне важно. Если код предполагается делать платформонезависимым, то лучше пользоваться стандартными средствами.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, ArtDenis, Вы писали:
RI>>По-моему я довольно точно сказал. Ну если надо, пожалуйста AD>...
AD>Т.к. это pod-тип, то можешь смело использовать memcpy. Скорость, как минимум, будет не меньше, чем при поэлементном копировании элементов.
Точно ли так? Там же в каждой структуре есть дырка в слово по крайней мере, и копиконструктор её пересылать не будет. Так что может memcpy и проиграет Кто его знает-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alex Alexandrov, Вы писали:
R>>Хотя всё таки разумнее использовать memcpy как минимум по двум причинам. Первая — её реализацию скорее всего соптимизировали на уровне ассемблера. Вторая — код будет более читабельным, т.к. сразу будет понятно что что-то копируется, а не просто цикл, а так же понятно что, куда и сколько. R>>
AA>Еще memcpy знает про то, что нужно делать, если копируются невыровненные данные на тех архитектурах, где это крайне важно. Если код предполагается делать платформонезависимым, то лучше пользоваться стандартными средствами.
А от чего цикл поэлементного копирования окажется менее читабельным или там более невыравненным, чем memcpy?
Казалось бы всё и так хорошо и если оптимизатору покажется, что лучше уж memcpy, то кто же его таки остановит-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, arcman, Вы писали:
A>Вот Вам книжка — всем читать!
A>http://arcman71.valuehost.ru/books/megabook.tgz A>("Крис Касперский — Техника ортимизации программ.djvu", 5.2 MB, распаковывается RAR'ом или TAR'ом)
A>PS: Разумеется электронная версия выложена в ознакомительных целях и подразумевает дальнейшую покупку своего легального бумажного собрата A>Преимущества бумажной версии думаю перечислять не стоит
Есть у меня дома полочка, на которую я ставлю книги, которые я бы вернул в магазин, если бы это возможно было. Если кончится место на полках и надо будет что-то делать — я их выкину без сожаления. Почти без сожаления — с поправкой на потраченные деньги. Сейчас на этой полке:
1. Роберт Дж. Оберг, COM+ технология — Основы и программирование.
2. Сулейман Лалани, Рамеш Чандэк, Active X.
3. Эш Рофэйд, Яссер Шохауд, COM и COM+.
4. Эрик Аллен, Типичные ошибки проектирования. 5. Крис Касперски, Техника оптимизации программ.
6. Еще пара книг, про которые даже говорить стыдно...
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, Erop, Вы писали:
AA>>Еще memcpy знает про то, что нужно делать, если копируются невыровненные данные на тех архитектурах, где это крайне важно. Если код предполагается делать платформонезависимым, то лучше пользоваться стандартными средствами.
E>А от чего цикл поэлементного копирования окажется менее читабельным или там более невыравненным, чем memcpy?
Если нигде не будет приведения указателей — то все ОК. Я лишь имел в виду, что memcpy общего характера не так прост, как кажется.
E>Казалось бы всё и так хорошо и если оптимизатору покажется, что лучше уж memcpy, то кто же его таки остановит-то?
Не понял. Если ты напишешь цикл, то компилятор его уже никак на memcpy не заменит. И слава Богу. Не надо нам таких умных компиляторов. Или под оптимизатором ты человека имел в виду?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, arcman, Вы писали:
A>Вот Вам книжка — всем читать!
A>http://arcman71.valuehost.ru/books/megabook.tgz A>("Крис Касперский — Техника ортимизации программ.djvu", 5.2 MB, распаковывается RAR'ом или TAR'ом)
А скажите пожалуйста, причём здесь техника оптимизации программ и приведённые мной результаты компиляции memcpy и копирования в цикле? Я что-то не понял...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.