memcpy
От: RI Украина  
Дата: 15.08.05 21:45
Оценка:
У меня копируется один массив в другой (его размер под 2 метра).
Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?
Re: memcpy
От: Павел Кузнецов  
Дата: 15.08.05 21:53
Оценка:
RI,

> У меня копируется один массив в другой (его размер под 2 метра).

> Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?

Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: memcpy
От: remark Россия http://www.1024cores.net/
Дата: 15.08.05 22:03
Оценка: +1
Здравствуйте, RI, Вы писали:

RI>У меня копируется один массив в другой (его размер под 2 метра).

RI>Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?

Если массив POD-типов, то быстрее не будет, а если не POD-типов, то будет веселее

А если серьёзно, то я думаю, что скорость копирования большого блока памяти всё равно упрётся в скорость работы с памятью. memcpy просто нечего предложить принципиально нового по сравнению с циклом копирования. Т.е. если грамотно написать цикл копирования (без лишних операций), то скорость его выполнения будет не на много отличаться.

Хотя всё таки разумнее использовать memcpy как минимум по двум причинам. Первая — её реализацию скорее всего соптимизировали на уровне ассемблера. Вторая — код будет более читабельным, т.к. сразу будет понятно что что-то копируется, а не просто цикл, а так же понятно что, куда и сколько.

1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: memcpy
От: RI Украина  
Дата: 15.08.05 22:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>RI,


>> У меня копируется один массив в другой (его размер под 2 метра).

>> Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?

ПК>Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?


Тип мой собственный структура из 2 полей : перечисление и double;
Re[2]: memcpy
От: remark Россия http://www.1024cores.net/
Дата: 15.08.05 22:39
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>RI,


>> У меня копируется один массив в другой (его размер под 2 метра).

>> Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?

ПК>Может, быстрее, может -- нет. Сначала нужно выяснить, будет ли копирование с помощью memcpy корректным, и если да, измерить время в обоих вариантах. Какие типы находятся в копируемом массиве?


В каком, например, случае копирование с помощью memcpy может быть медленее, чем в цикле? Если, конечно размер блока большой. Это всё таки библиотечная функция копирования.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Вопрос уже поднимался.
От: ZAMUNDA Земля для жалоб и предложений
Дата: 15.08.05 22:40
Оценка:
здесь
Автор: temik
Дата: 04.05.05
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[3]: memcpy
От: ArtDenis Россия  
Дата: 16.08.05 04:14
Оценка:
Здравствуйте, RI, Вы писали:

RI>Тип мой собственный структура из 2 полей : перечисление и double;


Приведи полностью описание твоей структуры.
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: memcpy
От: MaximE Великобритания  
Дата: 16.08.05 08:15
Оценка:
remark wrote:

> А если серьёзно, то я думаю, что скорость копирования большого блока памяти всё равно упрётся в скорость работы с памятью. memcpy просто нечего предложить принципиально нового по сравнению с циклом копирования. Т.е. если грамотно написать цикл копирования (без лишних операций), то скорость его выполнения будет не на много отличаться.


У меня есть сильное подозрение, что Intel C++ compiler for Linux разворачивает memcpy в mmx/sse, т.к. скорости рукописного цикла и memcpy gcc на моих тестах были в 3 раза меньше. Сглупил кода тестировал — не посмотрел asm output.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: memcpy
От: RI Украина  
Дата: 16.08.05 09:50
Оценка:
Здравствуйте, ArtDenis, Вы писали:

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


RI>>Тип мой собственный структура из 2 полей : перечисление и double;


AD>Приведи полностью описание твоей структуры.


По-моему я довольно точно сказал. Ну если надо, пожалуйста


enum SensorType {
   Gold = 0,
   Silver = 1,
   Platinum = 2
};

struct Sensor {
   SensorType stype;  // òèï
   double svalue;     // çíà÷åíèå
};
Re[5]: memcpy
От: ArtDenis Россия  
Дата: 16.08.05 09:57
Оценка:
Здравствуйте, RI, Вы писали:

RI>По-моему я довольно точно сказал. Ну если надо, пожалуйста

...

Т.к. это pod-тип, то можешь смело использовать memcpy. Скорость, как минимум, будет не меньше, чем при поэлементном копировании элементов.
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: memcpy
От: Вадим Никулин Россия Здесь
Дата: 16.08.05 10:12
Оценка:
Здравствуйте, RI, Вы писали:

RI>У меня копируется один массив в другой (его размер под 2 метра).

RI>Сейчас я планировал сделать это в цикле, а потом наткнулся на функцию memcpy.... с ней наверное будет быстрее? или нет?

А чем функция std::copy не угодила?
Re: memcpy
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.08.05 10:38
Оценка:
Здравствуйте, RI, Вы писали:


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 окажется медленнее — но это только предположение, в данный момент у меня не поставлено ни одного профилировщика, поэтому оценить скорость не могу ...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: memcpy
От: arcman Россия  
Дата: 17.08.05 11:27
Оценка:
Вот Вам книжка — всем читать!

http://arcman71.valuehost.ru/books/megabook.tgz
("Крис Касперский — Техника ортимизации программ.djvu", 5.2 MB, распаковывается RAR'ом или TAR'ом)

PS: Разумеется электронная версия выложена в ознакомительных целях и подразумевает дальнейшую покупку своего легального бумажного собрата
Преимущества бумажной версии думаю перечислять не стоит
Re[3]: memcpy
От: Vutik  
Дата: 17.08.05 12:27
Оценка:
ME>У меня есть сильное подозрение, что Intel C++ compiler for Linux разворачивает memcpy в mmx/sse, т.к. скорости рукописного цикла и memcpy gcc на моих тестах были в 3 раза меньше. Сглупил кода тестировал — не посмотрел asm output.

Скорее она использует DMA если размер блока большой...
Re[2]: memcpy
От: Alex Alexandrov США  
Дата: 17.08.05 18:04
Оценка:
Здравствуйте, 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)
Re[6]: memcpy
От: Erop Россия  
Дата: 17.08.05 18:28
Оценка:
Здравствуйте, ArtDenis, Вы писали:

RI>>По-моему я довольно точно сказал. Ну если надо, пожалуйста

AD>...

AD>Т.к. это pod-тип, то можешь смело использовать memcpy. Скорость, как минимум, будет не меньше, чем при поэлементном копировании элементов.


Точно ли так? Там же в каждой структуре есть дырка в слово по крайней мере, и копиконструктор её пересылать не будет. Так что может memcpy и проиграет Кто его знает-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: memcpy
От: Erop Россия  
Дата: 17.08.05 18:31
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

R>>Хотя всё таки разумнее использовать memcpy как минимум по двум причинам. Первая — её реализацию скорее всего соптимизировали на уровне ассемблера. Вторая — код будет более читабельным, т.к. сразу будет понятно что что-то копируется, а не просто цикл, а так же понятно что, куда и сколько.

R>>

AA>Еще memcpy знает про то, что нужно делать, если копируются невыровненные данные на тех архитектурах, где это крайне важно. Если код предполагается делать платформонезависимым, то лучше пользоваться стандартными средствами.


А от чего цикл поэлементного копирования окажется менее читабельным или там более невыравненным, чем memcpy?
Казалось бы всё и так хорошо и если оптимизатору покажется, что лучше уж memcpy, то кто же его таки остановит-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: memcpy
От: Alex Alexandrov США  
Дата: 17.08.05 19:48
Оценка: 1 (1) +4 -1 :))
Здравствуйте, 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)
Re[4]: memcpy
От: Alex Alexandrov США  
Дата: 17.08.05 19:54
Оценка:
Здравствуйте, 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)
Re[3]: memcpy
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 18.08.05 02:46
Оценка:
Здравствуйте, arcman, Вы писали:

A>Вот Вам книжка — всем читать!


A>http://arcman71.valuehost.ru/books/megabook.tgz

A>("Крис Касперский — Техника ортимизации программ.djvu", 5.2 MB, распаковывается RAR'ом или TAR'ом)

А скажите пожалуйста, причём здесь техника оптимизации программ и приведённые мной результаты компиляции memcpy и копирования в цикле? Я что-то не понял...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.