Obj-C:类方法与实例方法 - 效率差异?

时间:2014-02-26 16:36:10

标签: objective-c performance class-method

为了整洁和可重用,我正在考虑在一个类中放入一堆实用程序方法。该类不需要任何自己的属性,因此我将方法定义为类方法;我认为没有必要让这个类的实例浮动......

......还是有吗?效率有差异吗? (一个值得注意的?)或者调用类方法的行为方式与它们是调用类的一部分相同吗?

4 个答案:

答案 0 :(得分:7)

一般来说,dandan78有正确的答案。最好自己测量代码。事实上,对于这个问题,您可能应该按照您想要的方式实现它,然后进行测量,只有在它显着减慢您的应用程序时才进行更改。

Gavin也是正确的,C函数比类或实例方法更有效。但同样,除非你在紧密循环中调用这些方法数百万次,否则方法与C函数的开销可能对你的应用程序无关紧要。

但是为了回答所提出的问题,类方法和实例方法之间基本没有区别。在Objective-C中,类实际上是对象本身,向它们发送消息与向实例对象发送消息完全相同。每个类基本上都有一个单例对象,可以调用类方法。

答案 1 :(得分:3)

在所有关于效率相关困境的案例中,最好的办法是从编码的角度做有意义的事情 - 让代码尽可能直观且易读。如果事实证明某些事情并不像它需要的那么快,那么就进行分析和优化。

虽然我不认为在这种情况下会有任何区别,但你可以创建一个方法的类和实例版本,在一个循环中运行它一百万次,然后是[NSDate date]个调用,然后比较时间。

答案 2 :(得分:3)

实际上,最有效的方法是使它们成为C函数。每次调用其中一个时,您都将避免Objective-C运行时的开销。显然,基于你的问题的措辞,你不需要为这些实用方法保留额外的状态,因为你正在考虑让它们成为类方法。

当我保留这样的实用方法时,我大部分时间都将它们作为C函数,因为它是最干净,最有效的。当我可以用它们制作一个Objective-C类作为方法时,如果它们彼此有共同之处,那么以这种方式组织它们是有意义的,或者我是否需要为它们保持状态。

答案 3 :(得分:2)

I made a sample project将调用实例方法与类方法或C函数进行比较。这是一些示例输出:

Class methods:    Time to complete: 0.00415796
Single instance:  Time to complete: 0.00437099
Using Singleton:  Time to complete: 0.071667
Using Global:     Time to complete: 0.00534797
Using C function: Time to complete: 0.00302202

您应该从中获得的主要结论是差异可以忽略不计;使用Instruments来分析实际性能瓶颈。

要回到原始问题,您应该使用类方法,因为您的方法不依赖于实例可能包含的任何状态(属性)。性能方面,这只会有所帮助,因为使用实际实例意味着您必须以某种方式分配和访问该实例,这会增加开销(同样,这一切都可以忽略不计)。

使用C函数的速度会快得多,但是你不能像使用类方法那样子类化和覆盖那个C函数。