繁体   English   中英

将两个缓冲区合并为一个

[英]Combining two buffers into one

我需要有两个缓冲区( AB ),并且当两个缓冲区中的A已满时,都需要将其内容写入“合并的”缓冲区C 如下面在我的问题中所述,使用内存复制对于此操作而言似乎太慢了。 有见识吗?

我没有尝试过,但是有人告诉我,记忆复制将无法工作。 这是一个嵌入式系统。 2个缓冲区。 两种大小都不同,当它们完全笨拙时,它们比普通的“ C”缓冲区大得多。“ C”缓冲区的大小比其他两个大。

编辑:缓冲区A和B将在C完全为空之前写入。

内存复制花费的时间太长,并且公共缓冲区'C'超出了运行范围。

memcpy几乎是复制内存的最快方法。 它通常是编译器固有的,并且经过高度优化。 如果速度太慢,则可能必须寻找另一种方法来加快程序速度。

我希望更快地复制内存不是程序中最低的成果。

其他一些机会可能是复制较少的内存或减少复制的频率。 查看您是否可以对程序进行概要分析以分析其性能并找到最大的机会在哪里。

编辑:在进行编辑时,听起来好像有问题,就是在您注意到需要处理数据到输入更多数据之间,没有足够的时间来一次处理所有数据。如评论者之一所述,这种情况可能是需要在其他缓冲区之间进行切换。 因此,您可能有时间在一个数据处理完毕的同时又处理另一个数据。

不使用memcpy合并两个缓冲区的唯一方法是链接它们,例如缓冲区片段(或片段数组)的链表。

考虑一个缓冲区可能不一定总是连续的。 我已经完成了600dpi图像的大量工作,这意味着非常大的缓冲区。 如果您可以将它们分解为一系列较小的片段,则有助于减少碎片以及由于缓冲区增长而造成的不必要的复制。

在某些情况下,如果您的API /微控制器要求,则缓冲区必须是连续的。 例如,Windows位图功能需要连续性。 您可以尝试使用C realloc函数,但它可能在内部像malloc + memcpy + free的组合一样工作。 无论哪种方式,就像其他人之前所说的那样, memcpy被认为是复制连续缓冲区的最快方法。

如果缓冲区必须是连续的,则可以保留较大的地址空间并按需提交。 实现取决于平台。 例如,在Win32上, VirtualAlloc函数可以做到这一点。 这为您提供了一个非常大的连续缓冲区,其中只有一部分被分配(提交)。 稍后,随着缓冲区的增长,您可以提交更多页面。 此技巧需要虚拟内存的概念,而虚拟内存可能在微控制器上不可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM