标签: circular-buffer

有效的循环缓冲?

我想在python中创建一个有效的循环缓冲区(目标是取缓冲区中的整数值的平均值).

这是使用列表收集值的有效方法吗?

def add_to_buffer( self, num ):
    self.mylist.pop( 0 )
    self.mylist.append( num )
Run Code Online (Sandbox Code Playgroud)

什么会更有效(以及为什么)?

python circular-buffer

96
推荐指数
6
解决办法
7万
查看次数

如何在C中实现循环缓冲区?

我需要一个固定大小(在创建它时可在运行时选择,而不是编译时)循环缓冲区,它可以容纳任何类型的对象,并且它需要非常高的性能.我不认为会有资源争用问题,因为虽然它是在多任务嵌入式环境中,但它是一个合作的,所以任务本身可以管理它.

我最初的想法是在缓冲区中存储一个简单的结构,它包含类型(简单的枚举/定义)和一个指向有效负载的void指针,但我希望它尽可能快,所以我愿意接受绕过的建议堆.

实际上我很高兴绕过任何标准库的原始速度 - 从我所看到的代码来看,它没有针对CPU进行大量优化:看起来他们只是为了类似的东西编译C代码,strcpy()没有手工编码组装.

任何代码或想法将不胜感激.所需的操作是:

  • 创建具有特定大小的缓冲区.
  • 放在尾巴上.
  • 从头上得到.
  • 归还计数.
  • 删除缓冲区.

c circular-buffer data-structures

66
推荐指数
5
解决办法
20万
查看次数

如何创建一个封闭(循环)ListView?

我想创建一个自定义ListView(或类似),其行为类似于封闭(循环)的:

  1. 向下滚动 - 在到达最后一个项目后第一个开始(..,n-1,n,1,2,...)
  2. 向上滚动 - 在第一个项目到达后,最后一个开始(...,2,1,1,n,n-1,..)

这在概念上听起来很简单,但显然,没有直接的方法来做到这一点.谁能指出我正确的解决方案?谢谢 !

我已经收到一个答案(来自Streets Of Boston的Android开发者谷歌团体),但听起来有些丑陋:) -

我这样做是通过创建自己的列表适配器(从BaseAdapter子类).

我编写了自己的列表适配器,其getCount()方法返回一个HUUUUGE编号.

如果选择项'x',则此项对应于适配器位置='adapter.getCount()/ 2 + x'

对于我的适配器的方法getItem(int position),我查看我的数组备份适配器并获取索引上的项目:(position-getCount()/ 2)%myDataItems.length

你需要做一些更"特殊"的东西才能使它完全正常工作,但你明白了.

原则上,它仍然可以到达列表的结尾或开头,但如果你将getCount()设置为大约一百万左右,这很难做到:-)

customization android listview circular-buffer

57
推荐指数
3
解决办法
3万
查看次数

JavaScript中的循环缓冲区

有人已经在JavaScript中实现了循环缓冲区吗?没有指针你会怎么做?

javascript circular-buffer data-structures

36
推荐指数
4
解决办法
3万
查看次数

在循环排序数组中搜索元素

我们希望在复杂度不大于的循环排序数组中搜索给定元素O(log n).
示例:搜索13{5,9,13,1,3}.

我的想法是将循环数组转换为常规排序数组,然后对结果数组进行二进制搜索,但我的问题是我提出的算法是愚蠢的,它O(n)在最坏的情况下采取:

for(i = 1; i < a.length; i++){
    if (a[i] < a[i-1]){
        minIndex = i; break;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么第i个元素的相应索引将由以下关系确定:

(i + minInex - 1) % a.length
Run Code Online (Sandbox Code Playgroud)

很明显,我的转换(从循环到常规)算法可能需要O(n),所以我们需要一个更好的.

根据ire_and_curses的想法,这是Java中的解决方案:

public int circularArraySearch(int[] a, int low, int high, int x){
    //instead of using the division op. (which surprisingly fails on big numbers)
    //we will use the unsigned right shift to get the average
    int mid = (low + high) >>> 1; …
Run Code Online (Sandbox Code Playgroud)

algorithm binary-search circular-buffer

27
推荐指数
4
解决办法
3万
查看次数

Java中的线程安全循环缓冲区

考虑一些并行运行的Web服务器实例.每个服务器都拥有对单个共享"状态管理器"的引用,其作用是保留N所有服务器的最后请求.

例如(N=3):

Server a: "Request id = ABCD"        Status keeper=["ABCD"]
Server b: "Request id = XYZZ"        Status keeper=["ABCD", "XYZZ"] 
Server c: "Request id = 1234"        Status keeper=["ABCD", "XYZZ", "1234"]
Server b: "Request id = FOO"         Status keeper=["XYZZ", "1234", "FOO"]
Server a: "Request id = BAR"         Status keeper=["1234", "FOO", "BAR"]
Run Code Online (Sandbox Code Playgroud)

在任何时间点,可以从监视应用程序调用"状态管理器",该应用程序读取NSLA报告的最后请求.

在Java中实现此生产者 - 消费者方案的最佳方法是什么,使Web服务器的优先级高于SLA报告?

CircularFifoBuffer似乎是保存请求的适当数据结构,但我不确定实现高效并发的最佳方法是什么.

java thread-safety circular-buffer

27
推荐指数
2
解决办法
2万
查看次数

使用PACKET_MMAP和PACKET_TX_RING发送数据比"正常"(没有)慢

我正在使用PACKET_MMAP套接字选项在C中编写流量生成器来创建环形缓冲区以通过原始套接字发送数据.环形缓冲区充满了以太网帧以进行发送和sendto调用.环形缓冲区的全部内容通过套接字发送,这应该比在内存中具有缓冲区提供更高的性能,并且sendto对于需要发送的缓冲区中的每个帧重复调用.

当不使用PACKET_MMAP时,在调用单帧时,sendto从用户区内存中的缓冲区复制到内核内存中的SK buf,然后内核必须将数据包复制到NIC访问的内存中,并将NIC发送到DMA将帧放入其自己的硬件缓冲区并将其排队以进行传输.当使用PACKET_MMAP套接字选项时,mmapped内存由应用程序分配并链接到原始套接字.应用程序将数据包放入mmapped缓冲区,调用sendto而不是内核必须将数据包复制到SK buf中,它可以直接从mmapped缓冲区中读取它们.还可以从环形缓冲区而不是单独的分组/帧读取分组的"块".因此,性能提升是一个系统调用,用于复制多个帧,每个帧一次复制操作,以使其进入NIC硬件缓冲区.

当我将使用PACKET_MMAP的套接字的性能与"普通"套接字(其中包含单个数据包的char缓冲区)进行比较时,根本没有性能优势.为什么是这样?在Tx模式下使用PACKET_MMAP时,每个环形块只能放入一个帧(而不是像Rx模式那样每个环形块有多个帧)但是我创建了256个块,所以我们应该在一次sendto调用中发送256帧吗?

使用PACKET_MMAP进行性能main()调用packet_tx_mmap():

bensley@ubuntu-laptop:~/C/etherate10+$ sudo taskset -c 1 ./etherate_mt -I 1
Using inteface lo (1)
Running in Tx mode
1. Rx Gbps 0.00 (0) pps 0   Tx Gbps 17.65 (2206128128) pps 1457152
2. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.08 (2385579520) pps 1575680
3. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.28 (2409609728) pps 1591552
4. Rx Gbps 0.00 …
Run Code Online (Sandbox Code Playgroud)

c sockets performance network-programming circular-buffer

22
推荐指数
1
解决办法
4384
查看次数

haskell中的O(1)循环缓冲区?

我正在研究Haskell中的一个小概念项目,它需要一个循环缓冲区.我已经设法使用具有O(1)旋转的数组创建缓冲区,但当然需要O(N)来插入/删除.我发现使用列表的实现似乎需要O(1)进行插入和删除,但由于它保持左右列表,因此在旋转时越过某个边界将花费O(N)时间.在命令式语言中,我可以实现具有O(1)插入,删除和旋转的双向链接循环缓冲区.我认为这在像Haskell这样纯粹的功能性语言中是不可能的,但我很想知道我是不是错了.

haskell functional-programming circular-buffer

19
推荐指数
2
解决办法
2274
查看次数

如何在C/C++中编写简单的整数循环缓冲区?

我看到很多用于实现循环缓冲区的模板和复杂的数据结构.

如何为5个数字编码一个简单的整数循环缓冲区?

我在想C是最直截了当的吗?

谢谢.

c c++ arrays circular-buffer

18
推荐指数
2
解决办法
4万
查看次数

如何在linux内核空间中读取环形缓冲区?

我正在编写一个Linux字符驱动程序,可以在用户空间中打印系统日志.正如命令'dmesg'那样.我已经了解到,使用'printk'打印的所有日志都将被发送到名为ring buffer的空间.所以我有问题:

  1. 内核空间里面有环形缓冲区吗?
  2. 如果是这样,我如何读取内核空间内的环形缓冲区?(我试过阅读dmesg.c的源代码.但它没有帮助.)

linux logging kernel circular-buffer linux-kernel

18
推荐指数
2
解决办法
1万
查看次数