用C ++复制中小块内存的最快方法

时间:2012-02-09 18:02:09

标签: c++ directshow

我正在将Directshow过滤器中的字节缓冲区复制到C#程序提供的缓冲区中,缓冲区包含当前帧的位图,因此根据视频宽度和高度。

我发现较小的视频超快速检索视频帧,但较大的视频需要一些时间。我正在做我认为最简单的方法(这并不意味着我是对的,这就是我要问的原因)。

如果这是复制内存的最快方法,请告诉我吗?感谢

C ++代码:

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

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

5 个答案:

答案 0 :(得分:4)

使用标准库中的std::copy,或者您可以使用memcpy,但std::copy的速度与memcpy一样快。

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

答案 1 :(得分:2)

由于您使用的是C ++,为什么不使用std::copy

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

副本应使用memcopymemmove,而{{1}}或{{1}}将使用快速机器代码指令。

答案 2 :(得分:1)

使用std::copymemcpy将尽可能快。

为了处理视频帧,您希望尽可能避免复制和内存分配。为此,我将采取以下方法。

  1. 分配视频帧池,其等于视频处理管道的深度。
  2. 从您的SampleGrabber回调中复制 ONCE ,并避免进一步复制。
  3. 将视频帧处理放在单独的线程或线程上以提高性能。
  4. 如果您正在进行任何类型的视频解码,除非您以非常高的帧速率运行或在内存受限的系统上处理非常大的视频(2K或4K),否则内存带宽不应成为主要问题。

    如果您确实需要并行内存副本,您还可以使用英特尔Thread Building Blocks进行调查,以创建并行化任务,以块的形式复制视频帧。但是,除非你的视频是巨大的,否则你可能看不到直接memcpy之外的巨大性能提升。

答案 3 :(得分:0)

memcpy(pVideoBuffer,pBufferData,nBufSize)

文档在这里:http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

答案 4 :(得分:0)

C选项:memcpy / memmove

“memcpy比memmove更有效率。”一般情况下,只有在必要时才使用USE。当源和目标区域重叠的可能性非常合理时使用它。

使用参考:https://www.youtube.com/watch?v=Yr1YnOVG-4g Jerry Cain博士,(斯坦福简介系统讲座 - 7)时间:36:00