gpt4 book ai didi

objective-c - cocoa /Objective-C : how much optimization should I do myself?

转载 作者:行者123 更新时间:2023-12-03 16:49:01 24 4
gpt4 key购买 nike

我最近发现自己编写了一段代码来执行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com