我想在python中创建一个有效的循环缓冲区(目标是取缓冲区中的整数值的平均值).
这是使用列表收集值的有效方法吗?
def add_to_buffer( self, num ):
self.mylist.pop( 0 )
self.mylist.append( num )
Run Code Online (Sandbox Code Playgroud)
什么会更有效(以及为什么)?
我需要一个固定大小(在创建它时可在运行时选择,而不是编译时)循环缓冲区,它可以容纳任何类型的对象,并且它需要非常高的性能.我不认为会有资源争用问题,因为虽然它是在多任务嵌入式环境中,但它是一个合作的,所以任务本身可以管理它.
我最初的想法是在缓冲区中存储一个简单的结构,它包含类型(简单的枚举/定义)和一个指向有效负载的void指针,但我希望它尽可能快,所以我愿意接受绕过的建议堆.
实际上我很高兴绕过任何标准库的原始速度 - 从我所看到的代码来看,它没有针对CPU进行大量优化:看起来他们只是为了类似的东西编译C代码,strcpy()没有手工编码组装.
任何代码或想法将不胜感激.所需的操作是:
我想创建一个自定义ListView(或类似),其行为类似于封闭(循环)的:
这在概念上听起来很简单,但显然,没有直接的方法来做到这一点.谁能指出我正确的解决方案?谢谢 !
我已经收到一个答案(来自Streets Of Boston的Android开发者谷歌团体),但听起来有些丑陋:) -
我这样做是通过创建自己的列表适配器(从BaseAdapter子类).
我编写了自己的列表适配器,其getCount()方法返回一个HUUUUGE编号.
如果选择项'x',则此项对应于适配器位置='adapter.getCount()/ 2 + x'
对于我的适配器的方法getItem(int position),我查看我的数组备份适配器并获取索引上的项目:(position-getCount()/ 2)%myDataItems.length
你需要做一些更"特殊"的东西才能使它完全正常工作,但你明白了.
原则上,它仍然可以到达列表的结尾或开头,但如果你将getCount()设置为大约一百万左右,这很难做到:-)
有人已经在JavaScript中实现了循环缓冲区吗?没有指针你会怎么做?
我们希望在复杂度不大于的循环排序数组中搜索给定元素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) 考虑一些并行运行的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似乎是保存请求的适当数据结构,但我不确定实现高效并发的最佳方法是什么.
我正在使用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) 我正在研究Haskell中的一个小概念项目,它需要一个循环缓冲区.我已经设法使用具有O(1)旋转的数组创建缓冲区,但当然需要O(N)来插入/删除.我发现使用列表的实现似乎需要O(1)进行插入和删除,但由于它保持左右列表,因此在旋转时越过某个边界将花费O(N)时间.在命令式语言中,我可以实现具有O(1)插入,删除和旋转的双向链接循环缓冲区.我认为这在像Haskell这样纯粹的功能性语言中是不可能的,但我很想知道我是不是错了.
我看到很多用于实现循环缓冲区的模板和复杂的数据结构.
如何为5个数字编码一个简单的整数循环缓冲区?
我在想C是最直截了当的吗?
谢谢.
我正在编写一个Linux字符驱动程序,可以在用户空间中打印系统日志.正如命令'dmesg'那样.我已经了解到,使用'printk'打印的所有日志都将被发送到名为ring buffer的空间.所以我有问题:
circular-buffer ×10
c ×3
algorithm ×1
android ×1
arrays ×1
c++ ×1
haskell ×1
java ×1
javascript ×1
kernel ×1
linux ×1
linux-kernel ×1
listview ×1
logging ×1
performance ×1
python ×1
sockets ×1