我需要有两个缓冲区(A
和B
),当其中一个缓冲区已满时,需要将其内容写入“合并”缓冲区 - C
。对于此操作,使用memcopy似乎太慢,如我在下面的问题中所述。任何见解?'
我没有尝试,但我被告知memcopy无效。这是一个嵌入式系统。 2个缓冲区。两个不同的尺寸,当它们完全愚蠢到一个普通的'C'缓冲区,这个缓冲区的尺寸比其他两个更大..不知道为什么我的评分会下降..
编辑:缓冲区A和B将在C完全为空之前写入。
memcopy 耗时太长,公共缓冲区“C”已经过度运行。
答案 0 :(得分:9)
我希望更快地复制内存并不是程序中最低端的成果。
其他一些机会可能是复制较少的内存或较少复制。看看你是否可以对你的程序进行分析,以分析它的性能,并找出最大的机会。
编辑:通过编辑,听起来问题是,在您发现需要处理的时间和更多数据进入的时间之间,您没有足够的时间处理一些数据。正如其中一位评论者指出的那样,在这种情况下,解决方案可以提供额外的缓冲区,您可以在其间进行切换。因此,您可以有时间处理数据,而另一个数据则填满。
答案 1 :(得分:4)
在没有memcpy
的情况下合并两个缓冲区的唯一方法是链接它们,就像缓冲区片段(或片段数组)的链接列表一样。
考虑缓冲区可能并不总是必须是连续的。我已经完成了600dpi图像的大量工作,这意味着非常大的缓冲区。如果你可以将它们分解成一系列较小的片段,这有助于减少碎片以及由于缓冲区增长而导致的不必要的复制。
在某些情况下,如果您的API /微控制器强制要求,缓冲区必须是连续的。例如,Windows位图功能需要连续性。您可以尝试使用C realloc
函数,但它可能在内部工作,就像malloc
+ memcpy
+ free
的组合一样。无论哪种方式,正如其他人之前所说,memcpy
应该是复制连续缓冲区的最快方法。
如果缓冲区必须是连续的,您可以保留一个大的地址空间并按需提交。实施取决于平台。例如,在Win32上VirtualAlloc
函数可以做到这一点。这为您提供了一个非常大的连续缓冲区,其中只分配了一部分(已提交)。稍后您可以提交更多页面,因为缓冲区需要增长。这个技巧需要虚拟内存的概念,这可能在微控制器上无法使用。