Самый быстрый способ скопировать небольшие - средние куски памяти в C ++ - PullRequest
1 голос
/ 09 февраля 2012

Я копирую байтовый буфер в фильтре Directshow в буфер, предоставленный программой C#, буфер содержит растровое изображение текущего кадра и поэтому различается по размеру в зависимости от ширины и высоты видео.

Я считаю, что видео меньшего размера очень быстро извлекают видеокадр, однако для видео большего размера требуется некоторое время.Я делаю то, что считаю самым простым способом (это не значит, что я прав, поэтому и спрашиваю).

Скажите, пожалуйста, это самый быстрый способ копирования памяти?Спасибо

C ++ код:

STDMETHODIMP CSampleGrabber::GetBuffer(byte* pVideoBuffer)
{    
    int p=0;

    while (p< nBufSize) {
        pVideoBuffer[p]=pBufferData[p];
        p++;
    }
}

Ответы [ 5 ]

4 голосов
/ 09 февраля 2012

Используйте std::copy из стандартной библиотеки, в качестве альтернативы вы можете использовать memcpy, однако std::copy будет так же быстро, как memcpy.

std::copy(pVideoBuffer, pVideoBuffer+nBufSize, pBufferData);
2 голосов
/ 09 февраля 2012

Поскольку вы используете C ++, почему бы не использовать std::copy?

std::copy(pBufferData, pBufferData + nBufSize, pVideoBuffer);

копия должна использовать memcopy или memmove, что в свою очередь будет использовать инструкцию быстрого машинного кода.

1 голос
/ 09 февраля 2012

Использование std::copy или memcpy будет быстрым, насколько это возможно.

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

  1. Выделите пул видеокадров, равный глубине вашего конвейера обработки видео.
  2. Copy ONCE outвашего обратного вызова SampleGrabber и избегайте дальнейших копий.
  3. Поместите обработку вашего видеокадра в отдельный поток или потоки для повышения производительности.

Если вы выполняете декодирование любого видео, пропускная способность памяти не должна быть серьезной проблемой, если вы не используете очень высокую частоту кадров или не обрабатываете очень большое видео (2K или 4K) насистема с ограниченным объемом памяти.

Если вам действительно нужна распараллеленная копия памяти, вы также можете исследовать использование Thread Building Blocks от Intel, чтобы создать распараллеленную задачу для копирования видеокадра в блоки.Но, если ваше видео не гигантское, вы можете не увидеть значительного улучшения производительности за пределами прямой memcpy.

0 голосов
/ 10 декабря 2016

C опции: memcpy / memmove

"memcpy более эффективен, чем memmove."В общем, ИСПОЛЬЗУЙТЕ memmove только при необходимости.ИСПОЛЬЗУЙТЕ его, когда есть очень реальная вероятность того, что области источника и назначения перекрываются.

Используйте ссылку: https://www.youtube.com/watch?v=Yr1YnOVG-4g Доктор Джерри Кейн, (Стэнфордская вводная система - лекция - 7) Время:36: 00

0 голосов
/ 09 февраля 2012

memcpy (pVideoBuffer, pBufferData, nBufSize)

Документация находится здесь: http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

...