我正在实现一个2D数组并关注实现细节的效率,2D数组接口应该提供两个基本方法:
(假设数组是固定大小,在创建时指定,因此没有动态大小更改)
getObjectAtRow:柱:
setObjectAtRow:柱:
enumerateUsingBlock:^(id obj,NSUInteger row,NSUInteger column,BOOL * stop)
实现:
数组数组(NSMutableArray)
拥有一个大小为rowCount
的NSMutableArray并且其中的每个元素都是一个大小为columnCount
的NSMutableArray,然后getter将获取行数组然后从行数组获取指定列的对象,setter将使用相同的技术。 Enumerator使用两个枚举块,一个用于遍历行数组,另一个枚举用于所有对象。
线性数组(NSMutableArray)
只有一个实际对象的NSMutableArray,getter和setter将使用以下方法计算索引:
index = row * columnCount + column;
枚举器遍历线性数组,并计算行和数;专栏:
row = index / columnCount column = index%columnCount
C数组(假设元素是struct而不是类对象,大小是预定义的)
所以我有:
MyStruct elements[ROW_COUNT][COLUMN_COUNT]
然后以通常的C方式使用它,getter / setter刚刚进入/设置:
elements[row][column]
和枚举只是使用两个for循环
我的担忧:
哪一个效率更高?我觉得C阵列听起来效率更高,但是内存管理有点困难,尤其是在使用ARC时?
哪一个更好?线性数组或数组数组?也就是说,生成/除法在线性数组中获取/设置对象的速度更快,还是使用数组数组更快?
由于
答案 0 :(得分:0)
最快的选项是C数组,如果你真的关心性能,你不应该把它包装在Objective C类中,而是使用C结构或直接变量。
但是,最简单,几乎有效的方法是使用1D NSMutableArray
和一些内联包装函数:
inline id getObjectAt( NSMutableArray *o, int row, int col ) {
return [o objectAtIndex: row * MY_FIXED_WIDTH_HERE + col];
}
inline void setObjectAt( NSMutableArray *o, int row, int col, id value ) {
return [o replaceObjectAtIndex: row * MY_FIXED_WIDTH_HERE + col withObject: value];
}
这些函数将被内联,但仍然需要执行objective-c函数查找(objectAtIndex
/ replaceObjectAtIndex
)。通常,性能损失可以忽略不计;如果基准测试表明它很重要,那么只会担心它。
实现C阵列:内存管理很容易;只需在dealloc函数中添加一个循环到release
每个元素,并在set
函数中小心(保留新对象然后释放上一个对象)。您还需要设置您可能需要的任何复制和序列化/反序列化功能,以及nil
init
时的项目。对于ARC,您可以按文件配置它,因此只需为此对象的.m
文件禁用它。