Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环缓冲区有什么用途?_C#_.net_Data Structures_Circular Buffer - Fatal编程技术网

C# 循环缓冲区有什么用途?

C# 循环缓冲区有什么用途?,c#,.net,data-structures,circular-buffer,C#,.net,Data Structures,Circular Buffer,循环缓冲区有哪些用途 使用循环缓冲区的好处是什么 它是双链表的替代品吗?我知道这是作弊,但维基百科确实有很好的解释 循环缓冲区、循环缓冲区或 环形缓冲区是一种数据结构 使用单个固定大小的缓冲区,就像 它是端到端连接的。这 这种结构易于使用 缓冲数据流 一个可能使用 覆盖循环缓冲区时使用 多媒体如果缓冲区用作 中的有界缓冲区 生产者和消费者的问题就是这样 可能是制作人想要的 (例如,音频发生器)至 如果消费者 (例如,声卡)无法 暂时跟上。另一个例子 是数字波导合成 方法,该方法使用循环缓冲区

循环缓冲区有哪些用途

使用循环缓冲区的好处是什么


它是双链表的替代品吗?

我知道这是作弊,但维基百科确实有很好的解释

循环缓冲区、循环缓冲区或 环形缓冲区是一种数据结构 使用单个固定大小的缓冲区,就像 它是端到端连接的。这 这种结构易于使用 缓冲数据流

一个可能使用 覆盖循环缓冲区时使用 多媒体如果缓冲区用作 中的有界缓冲区 生产者和消费者的问题就是这样 可能是制作人想要的 (例如,音频发生器)至 如果消费者 (例如,声卡)无法 暂时跟上。另一个例子 是数字波导合成 方法,该方法使用循环缓冲区 有效地模拟声音 振动弦或管乐器

关于与双链接列表的比较,我想这确实取决于您使用该列表的目的。。。Cirrular缓冲区的实现似乎更复杂,请(再次)参考wiki页面;这说明了实现、注意事项等,并显示了示例代码


谢谢,Neil,我用它做了一个内存日志,大小有限。例如,应用程序将在处理用户请求时写入日志条目。每当发生异常(这将中断处理)时,当前内存中的日志记录将随异常一起转储

循环缓冲区的好处是,您不需要无限量的内存,因为较旧的条目会自动被覆盖。“挑战”是,您需要为您的用例找到合适的大小。在上面的示例中,如果包含有关异常的最重要信息的日志记录已经被覆盖,这将是非常不幸的

有些系统/应用程序有工具可以让您根据需要提取缓冲区的当前内容,而不仅仅是在自动提取时(如果有的话)

我相信,CLR和许多其他系统的内核或高性能跟踪/日志都是以这种方式实现的


使用这种缓冲区进行内存内跟踪/日志记录的概念实际上非常常见(并不是说这是唯一的用途——当然不是),因为它比将记录写入文件/数据库要快得多,除非发生错误,否则您可能永远不会感兴趣。另一方面,它节省了硬盘空间。

循环缓冲区是一种很好的机制,可以有效地以有序的方式维护值/项的滑动/移动列表。一个例子可能是保持最后N个项目的滑动平均值。假设您希望跟踪计算某个值的最后100次操作的平均成本。为此,您需要删除最旧的成本,并添加最新的成本

如果没有循环缓冲区,实现这一点(C风格)的代价高昂的机制将是拥有100个元素的数组。每次计算新成本时,您可以将99个元素向下移动,并将新的元素放在最后一个位置。这显然代价高昂。使用循环缓冲区的思想,只需跟踪缓冲区的“结束”(位置0-99)。它将标记最旧(或最新…无论您选择哪个)成本项目的位置。读取旧值(用于更新运行平均值)后,将其替换为最新值并增加缓冲区位置(如果缓冲区位置为99,则将其设置回0…因此,循环部分)


将其与双链接列表进行比较是没有意义的。循环缓冲区当然可以通过双链接列表(甚至是单链接列表)实现。但是比较它们有点像比较苹果和橙子。我用它作为实现循环调度的一种简单方法。基本上,我有一堆不同的对象,它们可以产生消费者可以处理的价值。我把所有的生产者放在一个环中,然后依次询问每个生产者。

我在多线程代码中使用了一个环缓冲区。基本上,如果所有插槽都已满,则制作人必须等待。消费者只需处理插槽中“已满”的项目

这是我开始的一条线。它对实施有一些很好的建议


循环缓冲区适用于嵌入式系统中的串行数据流。微控制器通常有一个UART来处理输入的串行字节,这些字节需要按顺序存储并在以后处理(字节的输入速度通常比处理速度快)

缓冲区有效地将所需的定时关键响应(字节输入时,以微秒为单位)拆分为对整个消息的非定时关键响应(例如,显示输入的消息,以毫秒为单位),例如:

1) 一旦收到一个字节,UART可以生成一个中断,软件通过快速获取接收到的字节并将其推到缓冲区的末端来响应该中断

2) 然后,后台软件例程可以定期检查缓冲区中是否有任何内容,并根据需要清空缓冲区


由于循环缓冲区大小可以在编译前定义,因此大小会受到限制。这有助于提高空间效率,并在数据开始丢失之前可以接收多少字节的权衡中消除内存损坏。

我的第一个问题的答案使用了音频生成器的循环缓冲区+1表示“我已使用它用于…”,而不是“您可以使用它用于…”