通过 Objective C++ 强大功能提高 iPhone 程序的性能
2010-02-10 00:23:00 来源:WEB开发网CGFloat xMax = CGRectGetMaxX(aRect);
CGFloat yMax = CGRectGetMaxY(aRect);
CGPoint* begin = (CGPoint*)[_spotsData bytes];
CGPoint* end = begin + _spotCount;
NSUInteger count = 0;
for (CGPoint* i = begin; i != end; ++i) {
if (i->x > xMin && i->y > yMin && i->x < xMax && i->y < yMax)
++count;
}
在没有改变基本算法的基础上,点计数的计算现在只需55毫秒,这大概比原来方法快了四倍。另一个好处是现在使用的内存是原来版本的一半。
第三种方法:算法优化
当然,还有许多聪明的方法来优化平面地图点的查询。例如,你可以使用四边形树来保存这些点。在本例中我使用了一种比较简单的解决方案,所以没有涉及数据存储的方式。我使用了C++的内置功能所以甚至不需要写任何代码来处理数据的存储。
我的设想是将数组中的位置从左至右分类。这样做的好处是确定指定正方形的左右边界十分快速(见下图)。当数组中边界已知时,仅需要检查边界间的点。
所以此算法是有关快速寻找边界的。我们使用的是二进制搜索,它适用于已排序的数组。它并不检查每个值以找到匹配的位置,而是直接跳到数组的中点,检查其值是小于还是大于给点值,然后跳到剩余部分的中心点,重复以上步骤。使用这种方法,二进制搜索需要 log2(n)的时间来查找最佳元素。对于一个拥有230,000个位置的数组,只需22次搜索!回到代码,我们发现上述算法的实现是很简单的。当然,我们必须为数据库排序:
// comparison function for array sorting
NSInteger leftToRight(Spot* a, Spot* b, void* context) {
CGFloat xa = a.position.x;
CGFloat xb = b.position.x;
if (xa < xb)
return NSOrderedAscending;
return xa > xb ? NSOrderedDescending : NSOrderedSame;
}
...
更多精彩
赞助商链接