如何优化对于给定运行始终返回相同值的函数的声明?

时间:2013-11-24 08:25:26

标签: objective-c compiler-optimization

我有一个objective-c类方法,对于给定的应用程序启动,始终返回相同的值;我记得在某个地方读过我可以用这样的方式声明一个函数,编译器会理解它并进行适当的优化。

可能static关键字有关,但我不记得了,Google只告诉我“他们不是静态方法,他们是类方法“,这根本不是我所说的。”

我的具体情况 - 虽然问题适用于任何函数或方法 - 是UIColor上的一个类别,它以与[UIColor redColor] et类似的方式返回特定于应用程序的颜色值。人。虽然这些颜色可以根据设备进行自定义,并且可能会从一次运行更改为下一次运行,但每次运行应用程序时始终 的值相同。

虽然我也对任何此类优化中是否具有特定价值感兴趣,但我对实际声明中的更感兴趣。我很高兴听到我“做错了”,但我也想听听我怎么能以这种方式宣布一个函数或方法。

更新: static无关;抱歉,这无关紧要。

4 个答案:

答案 0 :(得分:2)

可以使用静态变量。它的值将在函数调用中保留,因此如果您从不修改它,它将在程序的整个生命周期中存储相同的值。像这样:

- (UIColor *)beautifulColor
{
    static UIColor *color = nil;

    if (color == nil) {
        color = [ColorFactory randomColor];
    }

    return color;
}

答案 1 :(得分:2)

我认为你正在考虑"inlining",这是编译器用函数体取代函数调用的地方,这避免了调用的微小开销。

海湾合作委员会的文件说,这将发生在“足够简单”的功能上,可能包括像你所说的那样的常数功能。

但这不适用于ObjC 方法。由于动态调度,无法内联任何方法。当您编写[queequeg castHarpoon];时,您只是发送消息,而不是以fabs()是函数调用的方式直接调用方法。 queequeg可能会或可能不会实际运行名为castHarpoon的方法。有98%的时间,这就是发生的事情,但是对象在运行时可以选择运行其他方法。这意味着编译器不能内联使用方法体发送的消息。

答案 2 :(得分:0)

执行此操作的方法是拥有一个共享首选项对象,通常是单例,init函数执行此查找或计算,然后将其存储在属性中。

在此之后,需要该信息的方法将使用该属性。如果属性是非原子的,那么它的开销应该很小。

如果要避免所有开销,请声明静态变量或全局变量(如C中所示),并在启动期间进行设置。并不是说有人真正推荐全局变量。 EEW。 :)

答案 3 :(得分:0)

我找到了!当然,答案是关于NSHipster并与__attribute__ directive有关。

在我的特定情况下,const说明符似乎最合适:

  

const属性指定函数不检查除其参数之外的任何值,并且除了返回值之外没有任何效果。请注意,具有指针参数并检查指向的数据的函数不能声明为const。同样,调用非const函数的函数通常不能是const。

所以我要将我的类方法声明为:

+ (UIColor *)primaryTintColor __attribute__((const));

如上所述添加__attribute__指令后,代码编译时没有错误,并在Xcode 5.0.2和iOS SDK 7.0下按预期运行。

但正如其他人在下面的评论中指出的那样,方法在内部解析为包含用于解析self的指针参数的函数,因此__attribute__((const)) 从不适合于方法。在这种情况下,虽然它是对+[UIColor colorWithRed:green:blue:alpha:]的简单调用,但我会保持原样,但是当它变得更复杂时 - 比如稍微定制不同设备的值 - 我可能会使用静态变量来缓存值并使用性能分析来量化任何改进。