首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Objective C中实现循环缓冲区以获得高性能

如何在Objective C中实现循环缓冲区以获得高性能
EN

Stack Overflow用户
提问于 2017-01-26 15:00:15
回答 1查看 1.6K关注 0票数 0

我们希望每秒多次向Objective C中的循环缓冲区添加一个双精度数组。

我们当前使用的是嵌套在另一个NSMutableArray (2D数组)中的NSMutableArray。这工作得很好,但是对于我们的需求来说太慢了。

我们希望每秒多次添加到循环缓冲区中。当我们这样做并进行性能监控时,我们会看到对removeObjectAtIndex:0的调用变成了一个瓶颈(移动n-1个对象或O(n-1))。这是因为我们的循环缓冲区中有数千个条目。

我们已经考虑了使用STL和std::deque的可能性。我们还研究了CHDataStructures。如你所知,STL是在C++中的,可以集成,但不像Objective C解决方案那样直接。CHDataStructures已经过时,不符合ARC规范。

如果可能,请用代码示例建议我们应该如何实现循环缓冲区(用于我们的双精度数组)以获得高性能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 16:04:04

读完你的评论(并仔细考虑了一下),我意识到使用常规的NSArray会更好,因为没有内存管理问题(NSArrays会自然地保留它们的对象)。只需预先定义容量,以避免它在运行时必须重新分配内存。调用[self resetBuffer]将快速释放所有数据并重新开始。

代码语言:javascript
复制
#define BUFFER_SIZE 1000

@implementation ViewController {
    NSMutableArray *circularBuffer;
    NSUInteger bufferHead;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self resetBuffer];
    }
    return self;
}

- (void)addArrayToBuffer:(NSMutableArray *)incoming {

    if (bufferHead < circularBuffer.count)
        [circularBuffer replaceObjectAtIndex:bufferHead withObject:incoming];
    else
        [circularBuffer addObject:incoming];

    bufferHead = (bufferHead + 1) % BUFFER_SIZE;
}

- (NSArray *)bufferContent {

    if (circularBuffer.count < BUFFER_SIZE) {
        return circularBuffer;
    } else {
        NSArray *arrHead = [circularBuffer objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, bufferHead)]];
        NSArray *arrTail = [circularBuffer objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(bufferHead, BUFFER_SIZE-bufferHead)]];

        return [arrTail arrayByAddingObjectsFromArray:arrHead];
    }
}

- (void)resetBuffer {
    circularBuffer = [NSMutableArray arrayWithCapacity:BUFFER_SIZE];
    bufferHead = 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41868272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档