0

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

我们目前正在使用嵌套在另一个 NSMutableArray(二维数组)中的 NSMutableArray。这工作正常,但对我们的需求来说太慢了。

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

我们已经研究过可能使用 STL 和 std::deque。我们还查看了 CHDataStructures。如您所知,STL 在 C++ 中,可以集成,但不如 Objective C 解决方案那么简单。CHDataStructures 已经过时并且不符合 ARC。

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

4

1 回答 1

1

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

#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;
}
于 2017-01-26T08:04:04.277 回答