我看到很多用于实现循环缓冲区的模板和复杂的数据结构.
如何为5个数字编码一个简单的整数循环缓冲区?
我在想C是最直截了当的吗?
谢谢.
我想对特定方法进行一些性能测量,但我想平均完成所需的时间.(这是一个C#Winforms应用程序,但这个问题很适用于其他框架.)
我有一个秒表,我在方法开始时重置并在结束时停止.我想将最后10个值存储在列表或数组中.每个新增加的值都应该从列表中删除最旧的值.
我会定期调用另一种方法来平均所有存储的值.
我认为这个构造是一个循环缓冲区是正确的吗?
如何创建具有最佳性能的缓冲区?现在我有以下内容:
List<long> PerfTimes = new List<long>(10);
// ...
private void DoStuff()
{
MyStopWatch.Restart();
// ...
MyStopWatch.Stop();
PerfTimes.Add(MyStopWatch.ElapsedMilliseconds);
if (PerfTimes.Count > 10) PerfTimes.RemoveAt(0);
}
Run Code Online (Sandbox Code Playgroud)
这在某种程度上似乎效率低下,但也许并非如此.
建议?
使用余数运算符很容易通过循环缓冲区向前迭代而不使用条件...
iterator = (iterator + 1) % buffer_size;
我不能为我的生活弄清楚反向操作,向后迭代.
我正在使用循环缓冲区将数据推送到列表的任何一端.在我完成之后,我想对齐缓冲区,使列表中的第一个元素位于零位置,并且可以像常规数组一样使用,而不需要任何花哨的索引开销.
所以我有我的循环list容量N,它有n从任意索引开始的元素f.

移动/旋转所有元素的最快方法是f = 0什么?
问题是我想要就地做到这一点(当然,当然需要一些寄存器/临时工).缓冲区可能是full(n = N),[ EDIT ],但我也有兴趣有效地处理它几乎为空的情况.
我正在寻找最佳方式(如果有的话)将连续视频捕获到SD卡上的循环缓冲区,允许用户在事件发生后捕获事件.
标准视频录制API允许您直接写入文件,当您达到限制(由用户设置或SD卡的容量)时,您必须停止并重新开始录制.这将创建长达2秒的长窗口,其中录制未运行.这就是DailyRoads Voyager等现有应用已经做过的事情.为了最大限度地减少丢失重要事物的可能性,你可以将分裂时间设置为很长的时间,比如10分钟,但是如果事件发生在接近这个时间跨度的末尾,你就会在开始时存储9分钟的空间而浪费空间.
所以,我现在的想法如下:我将有一个大文件作为缓冲区.我将使用我发现的一些代码来捕获帧并将它们保存到文件中,最后包裹.当用户想要保留一些部分时,我会通过指向缓冲区的开头和结尾的标记来标记它.录制可以像以前一样继续,跳过标记为保留的区域.
录制停止后,或者在后台线程中(取决于手机/卡的速度),我会将标记的区域复制到另一个文件并删除覆盖保护.
主要问题,如果您不关心上述细节:我似乎无法找到将各个帧转换为Android SDK中的视频文件的方法.可能吗?如果没有,是否有任何可用的库,可能是本机代码,可以做到这一点?
我并不关心未压缩帧的大缓冲区,但导出的视频应该以Android友好的格式压缩.但是,如果有一种压缩缓冲区的方法,我想听听它.
谢谢.
android video-capture continuous circular-buffer video-encoding
我想帮助提高循环缓冲区代码的效率.
我看了一下stackoverflow,发现(几乎)循环缓冲区的所有主题都是关于这种缓冲区的使用或循环缓冲区的基本实现.我真的需要有关如何使其超级高效的信息.
计划是将此缓冲器与STM32F4微控制器一起使用,该微控制器具有单个精确FPU.我计划大量使用write()和readn()函数.我们实际上只是在这里谈了几百万个电话,所以在这里刮几个时钟周期,确实会有所作为.
我将把最重要的代码放在这里,完整的缓冲区代码可以通过http://dl.dropbox.com/u/39710897/circular%20buffer.rar获得.
任何人都可以向我提供一些关于如何提高此缓冲区效率的指示吗?
#define BUFF_SIZE 3 // buffer size set at compile time
typedef struct buffer{
float buff[BUFF_SIZE];
int readIndex;
int writeIndex;
}buffer;
/********************************\
* void write(buffer* buffer, float value)
* writes value into the buffer
* @param buffer* buffer
* pointer to buffer to be used
* @param float value
* valueto be written in buffer
\********************************/
void write(buffer* buffer,float value){
buffer->buff[buffer->writeIndex]=value;
buffer->writeIndex++;
if(buffer->writeIndex==BUFF_SIZE)
buffer->writeIndex=0;
}
/********************************\
* float readn(buffer* buffer, int Xn)
* reads specified …Run Code Online (Sandbox Code Playgroud) 我有一个类似的数组[A,B,C,D].我想在for循环中访问该数组,如as
var arr = [A,B,C,D];
var len = arr.len;
for(var i = 0;i<arr.len;i++){
0 - A,B,C
1 - B,C,D
2 - C,D,A
3 - D,A,B
}
Run Code Online (Sandbox Code Playgroud)
我想在JavaScript中访问它,任何想法?
我正在尝试找到一种方法来实现无锁或无阻塞方式,为单个消费者/单个消费者创建一个环形缓冲区,它将覆盖缓冲区中最旧的数据.我已经阅读了很多无锁算法,如果缓冲区已满,当你"返回false"时可以工作 - 即不添加; 但是,当你需要覆盖最旧的数据时,我甚至找不到谈论如何做的伪代码.
我正在使用GCC 4.1.2(工作中的限制,我无法升级版本......)并且我有Boost库,并且在过去我制作了自己的Atomic <T>变量类型,它紧跟着upcomming规范(它不完美,但它是线程安全的,并做我需要的).
当我想到它时,我认为使用这些原子应该真正解决问题.关于我在想什么的一些粗糙的伪代码:
template< typename T , unsigned int Size>
class RingBuffer {
private:
Atomic<unsigned int> readIndex;
Atomic<unsigned int> writeIndex;
enum Capacity { size = Size };
T* buf;
unsigned int getNextIndex(unsigned int i)
{
return (i + 1 ) % size;
}
public:
RingBuffer() { //create array of size, set readIndex = writeIndex = 0 }
~RingBuffer() { //delete data }
void produce(const T& t)
{
if(writeIndex == getNextIndex(readIndex)) //1
{
readIndex = getNextIndex(readIndex); …Run Code Online (Sandbox Code Playgroud) 这是一个包含boost::circular_buffer一些的类struct.我为迭代器创建了一个typedef到包含的中circular_buffer.
我的问题是:当doWork标记函数时const,由于返回值的原因,返回的值std::upper_bound与MyIterator类型不兼容boost::cb_details::const_traits.如果我const从函数中删除关键字,我的所有编译错误都会消失.
要清楚编译器错误是这样的:
Run Code Online (Sandbox Code Playgroud)error: conversion from ‘boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::const_traits<std::allocator<Wrapper<int>::Sample> > >’ to non-scalar type ‘Wrapper<int>::MyIterator {aka boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::nonconst_traits<std::allocator<Wrapper<int>::Sample> > >}’ requested [](const Sample& a, const Sample& b) { return a.foo < b.foo; });
这是一个独立的例子:
#include <algorithm>
#include <boost/circular_buffer.hpp>
template <typename T>
class Wrapper {
public:
struct Sample {
T foo;
};
typedef typename boost::circular_buffer<Sample>::iterator MyIterator;
Wrapper(int size) { cb.resize(size); …Run Code Online (Sandbox Code Playgroud) circular-buffer ×10
arrays ×3
c ×3
c++ ×3
algorithm ×1
android ×1
boost ×1
c# ×1
c++11 ×1
collections ×1
continuous ×1
embedded ×1
iteration ×1
javascript ×1
list ×1
loops ×1
nonblocking ×1