WEB开发网
开发学院手机开发iPhone 开发 通过 Objective C++ 强大功能提高 iPhone 程序的性... 阅读

通过 Objective C++ 强大功能提高 iPhone 程序的性能

 2010-02-10 00:23:00 来源:WEB开发网   
核心提示:spots = [spots sortedArrayUsingFunction:leftToRight context:NULL];现在是有趣的部分:使用C++进行二进制搜索,我们使用了#include 中的库函数 std::lower_bound,通过 Objective C++ 强大功能提高 iPhone 程序的性

spots = [spots sortedArrayUsingFunction:leftToRight context:NULL];

现在是有趣的部分:使用C++进行二进制搜索。我们使用了#include 中的库函数 std::lower_bound。它需要一个起点,终点,要查找的值以及比较函数。它返回比较为false的第一个值。起点和终点可以是简单的指向数组的C指针。

#include

bool cmpX(const CGPoint& a, const CGPoint& b) {

return a.x < b.x;

}

CGFloat yMin = CGRectGetMinY(aRect);

CGFloat yMax = CGRectGetMaxY(aRect);

CGPoint* begin = (CGPoint*)[_spotsData bytes];

CGPoint* end = begin + _spotCount;

CGPoint leftMargin = aRect.origin;

CGPoint rightMargin;

rightMargin.x = CGRectGetMaxX(aRect);

CGPoint* left = std::lower_bound(begin, end, leftMargin, cmpX);

CGPoint* right = std::lower_bound(left, end, rightMargin, cmpX);

NSUInteger count = 0;

for (CGPoint* i = left; i != right; ++i) {

if (i->y > yMin && i->y < yMax)

++count;

}

注意第二个二进制搜索,它仅从左边界而不是整个数组查找右边界。另一个优化是从循环中移除X-轴的检查,这是因为已经通过指定边界完成了这部分工作。

通过这些优化,只需要1毫秒来对长方形进行计数。这是第一个版本的200倍。

结果

下面是运行在三种不同设备上的示例项目的输出。如果你需要运行在你自己的设备上,你只需将目标设定中将代码签名标识符改为自己的。如果你不希望用在通用标识符的程序上,你还需要更改Info.plist中的包标识符(Bundle Identifier)。

iPhone 3G:

SpotsDB1 needed 3.2 seconds to count spots in 13 rects

that's 244.423 ms per rect

SpotsDB2 needed 3.0 seconds to count spots in 55 rects

that's 55.230 ms per rect

SpotsDB3 needed 3.0 seconds to count spots in 2988 rects

that's 1.004 ms per rect

第二代iPod Touch:

SpotsDB1 needed 3.1 seconds to count spots in 16 rects

上一页  1 2 3 4 5  下一页

Tags:通过 Objective 强大

编辑录入:coldstar [复制链接] [打 印]
赞助商链接