为iPhone编写干净,高性能的代码

时间:2009-05-26 08:14:08

标签: iphone performance optimization coding-style

我使用Objective-C在iPhone上进行了几个月的开发,并且在使用Java开发应用程序时,我一直在应用学习和改进的最佳实践。这些包括:设计具有单一责任的类,在适当情况下应用设计模式,以及编写仅执行一项操作的short methods。对我来说,从clean-code的角度来看,这些实践都是有益的,并且在很大程度上与领域无关。

我对结果非常满意。然而,一些iPhone开发人员已经独立地建议我反对这一点,因为他们说我写了太多的课程和太多的方法。在不同的时间我都被警告过:

  • 堆栈会吹
  • 太多的课程会使iPhone减速(即用户可以察觉)
  • 嵌套方法调用会损害性能(即用户可感知)

在实践中,我没有遇到过这些问题。在某些iPhone performance metrics上表面看来,在我看来,实现常见模式和简短方法所需的额外方法调用和对象生命周期开销不太可能产生任何用户可察觉的延迟。但是,其他iPhone开发人员的建议让我感到害怕。

我想继续学习和完善过去一直很好用的领域不可知的编程实践,但是当我在iPhone上开发时,我不希望走下一条痛苦的路线!

所以关于这个平台 - 我是否应该放弃一些常见的最佳实践,并更加意识到优化方法调用和对象生命周期开销?或者我应该继续关注Knuth's建议:

  

过早优化是其根源   所有邪恶(或至少大部分)在   编程

4 个答案:

答案 0 :(得分:1)

对我而言,它确实归结为可维护性。使用高质量的代码,您可以更轻松地维护系统。

我有开发人员和我一起工作,当我建议他们采取捷径来使系统工作时,他们嘲笑我并延迟交付项目。从长远来看,它每次都支付!!!

如果它是一个密集的应用程序,使用opebGL,那么性能可能会成为一个问题。如果它只是一个简单的实用程序或数据应用程序。我建议继续学习你所知道的最佳代码实践,然后继续学习它们,因为它们非常宝贵。大多数模式都是域不可知的,并且对所有基本编程语言都有益。

如果你这样做吹栈,然后重新因子其中一些方法/类为单一通话功能(至少你知道它会发生,并会尽快,因为它发生察觉),而如果它不那么你有真棒代码保持这一点很容易被任何半生不熟的代码猴子阅读,后者必须看一下它。

答案 1 :(得分:1)

OO应用程序放慢的整个问题只是对象可能比结构化编程风格更容易失控。曾几何时,在方法调用优化得到改进之前,这可能会有所不同,尤其是在进行间接(即虚拟)调用时。

如果您的对象被大量使用,并且您有一些经常调用的低级对象,那么您可能会因使用它们而受到性能影响 - 但我正在谈论数百万次调用(我见过一些在我的时代,可怕的代码,非结构化,结构化和OO!)。如果您不断地分配和删除批次(LOTS)对象,您将获得更多的性能影响。

唯一的答案是,看一看。如果你有一个被分配的对象,快速连续删除,然后优化它(即使它看起来不那么优雅),如果你有一个你称之为方法数千次的对象,那么也要优化它。 (但是一旦你完成了这个测量,你就会测量它的性能,你将会改进慢速位!)

“优雅”的代码和简单快速的代码之间存在权衡,不要走极端,你应该没事。

答案 2 :(得分:1)

在开发相当复杂的Blackberry应用程序时,我有类似的经历。我也被告知要避免频繁的对象分配,内部类等。我们原来的应用程序是一个难以维护的混乱。我最近重写了应用程序,重点是良好的OO设计(需要的模式,许多单用途和通常不可变的对象等)。在很多地方,我违反了避免某些“昂贵”的构造和对象分配的建议。最终的应用程序不仅更容易维护,而且更小。如果额外的对象分配产生任何开销,我当然没有注意到。我认为这里的教训正是Knuth所说的。首先关注良好的设计,然后根据需要进行优化。此外,现在这些移动设备有足够的内存,以至于这个建议有望不受欢迎......

答案 3 :(得分:0)

一般来说:不要担心。使用对象和消息可能是潜在性能问题的唯一情况是,您一次进行数百或数千次分配,或者每隔几毫秒进行数千条消息发送。您不希望在物理模拟中使用Obj-C对象来表示数千个3D矢量。

即使在循环中进行大量消息发送的情况下,也可以通过在循环之前将函数指针存储到适当的方法来获得更好的性能。