- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近发现自己编写了一段代码来执行 Core Data 获取,然后分配两个可变数组,其初始容量等于从获取返回的结果数:
// Have some existing context, request, and error objects
NSArray *results = [context executeFetchRequest:request error:&error];
NSMutableArray *firstArray = [[[NSMutableArray alloc]
initWithCapacity:[results count]] autorelease];
NSMutableArray *secondArray = [[[NSMutableArray alloc]
initWithCapacity:[results count]] autorelease];
写完后我又看了一遍,有件事让我觉得很奇怪:我调用了[results count]
两次。结果集可能非常大(数百个,也许一千个对象)。
我的第一个原则是将[结果计数]
分解为一个单独的NSUInteger,然后使用该整数作为每个数组的容量。我的问题:这种手动优化有必要吗?编译器是否会识别出它正在运行 [results count]
两次并仅保留该值,而无需我显式指定该行为?或者它会运行该方法两次 - 一个可能成本高昂的操作?
同样,程序员(尤其是 iPhone 程序员,可用的内存/处理能力有限)还应该手动执行哪些其他优化,而不是信任编译器?
最佳答案
回答实际问题:不,Objective-C 编译器永远无法优化方法发送。 (嗯,实际上,有一种可能的情况:如果它确定接收者为零。)
类无法提供有关方法行为的保证(特别是,您不能将 gcc 的 __attribute__((const))
等与方法一起使用),并且编译器无法告知将调用什么方法实现因为 Objective-C 的动态特性。例如,results
实际上可能是一个代理对象,每次调用它时都会将count
方法转发到随机对象。 Core Data 没有特殊原因这样做,但编译器并不知道。
除此之外,调用 -[NSArray count]
的成本微不足道,并且除了极其人为的代码之外,该特定方法绝对不可能成为任何瓶颈。避免重复调用的习惯可以合理地认为是值得的,但实际上担心成本或出于性能原因返回“纠正”它会浪费时间,很可能比你的程序在整个调用 -[NSArray count]
上花费的时间还要多它的使用生命周期。
关于objective-c - cocoa /Objective-C : how much optimization should I do myself?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1279656/
我是一名优秀的程序员,十分优秀!