LINUX.ORG.RU

Копирование перекрывающихся участков памяти


0

1

Сейчас с коллегой дискутировали о реализации копирования перекрывающихся областей памяти. Ес-но нужно сделать как быстрее и более безглючно.

Участки перекрываются так:

 1.      |----------|
 2. |----------|
Нужно перенести данные из 1 в 2. Стандартными функциями пользоваться в принципе можно, но это слишком большая надежда, что она всегда будет копировать от начала к концу, а не наоборот.

Я предложил обычный цикл for, тупо скопировать из 1 в 2 побайтно. Коллега говорит, что лучше вычислить кусок до перекрытия, скопировать его стандартной функцией, потом докопировать остальное опять же стандартной функцией. Типа говорит, что так будет быстрее несмотря на усложнение алгоритма.

Действие происходит в ядре Linux. Куски памяти могут быть до 15 Мб.

Как считаете, как будет быстрее? Есть ли еще какой-то путь? Заранее спасибо за участие.

★★★★★

Ответ на: комментарий от geekless

Ну вон жетти утверждает выше. Я тоже не вижу смысла.

hibou ★★★★★ ()
Ответ на: комментарий от hibou

Жетти не очень внимательно читает маны.

Ну и ман, конечно, можно было написать другими словами.

Legioner ★★★★★ ()
Ответ на: комментарий от hibou

Что собственно и делается... и это не соответствует описанию в манах :)

Jetty ★★★★★ ()
Ответ на: комментарий от hibou

да он упоролся просто, и твердит теперь про какие-то умолчательные случаи.

maloi ★★★★★ ()

так будет быстрее

имхо все «стандартные» функции копирования фигачат for()

x0r ★★★★★ ()

В ядре же есть хорошая memmove. Шанс сделать самому лучше очень мал.

sergej ★★★★★ ()
Ответ на: комментарий от Jetty

Кстати в ядре это реализуется ассемблером а не вызовом из string.c

О каком string.c идет речь? Понятно же, что ядро не юзает функции из libc.

Waterlaz ★★★★ ()
Ответ на: комментарий от Harald

Процессор внутри давно уже RISC, непрофильные команды заставляют его сильно чесать репу.

Booster ★★ ()
Ответ на: комментарий от Waterlaz

:) О таком %)

jet@node1:~$ grep 'void.*memmove' /usr/src/linux-source-2.6.32/lib/string.c
void *memmove(void *dest, const void *src, size_t count)

Jetty ★★★★★ ()

Практически всегда можно написать более быстрый аналог стандартной функции, другой вопрос надо ли. Нужно смотреть конкретную реализацию, чтобы понять насколько она отстойна.

Booster ★★ ()

Кстати,

интересно, что там в CUDA насчет копирования памяти.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Waterlaz

Какой нах третий участок? Ты чем ударился?

ну как, у него открылся третий участок, и, когда он это заметил, то упал на пол и больно ударился пятым участком

shty ★★★★★ ()
Ответ на: комментарий от Harald

инженеры Intel дооптимизировались до того, что обычный mov в цикле, выдаваемый компиляторами, работает быстрее )

а вот баллонов на инженеров интел не надо

shty ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.