静态方法或单例性能方面(Android)?

Posted

技术标签:

【中文标题】静态方法或单例性能方面(Android)?【英文标题】:Static methods or Singletons performance-wise (Android)? 【发布时间】:2010-10-10 08:47:23 【问题描述】:

在具有少量 POJO 和许多对其进行操作的辅助方法的应用程序中,在性能方面哪个更好:将辅助类设为单例或将方法设为静态?

【问题讨论】:

【参考方案1】:

静态方法在性能和内存方面会稍微好一些:

    避免虚拟函数调用的(潜在)开销。 消除类的实际实例所需的内存。 使用时无需获取类的实例。

但老实说,我可能仍然会将其设为singleton。不这样做所获得的收益可能很小,以至于即使在移动环境中,它们也会产生零差异。

【讨论】:

【参考方案2】:

你能避免这两种情况并让它们成为常规课程吗?

忽略性能问题,我建议避免使用单例和静态方法来提高可测试性。

单例和静态方法很难测试;在这方面,单例本质上是静态方法,但名称不同。 Misko Hevery,在Google Test team 工作,有几篇关于这个主题的好文章:

Singletons are Pathological Liars Static Methods are Death to Stability

【讨论】:

【参考方案3】:

不要担心这种荒谬的微优化。担心可维护性。

听起来该应用程序是完全以非 OO 风格编写的,并且可以从消除大多数“辅助方法”并将它们放在它们所属的位置以及它们所操作的数据中受益良多。

【讨论】:

好的,那么 JDK 也是以非 OO 风格编写的,包括 Arrays.sort()、Long.valueOf() 等;) 这里和那里有一个静态方法和让你的整个应用程序只由值对象和静态方法中的所有逻辑组成有很大的区别(可能并非如此,但这就是你说得好听)。 @Michael:但 android 的内存确实很低。我正在考虑你在这篇文章和***.com/questions/1284718/… 上的建议【参考方案4】:

从表面上看您的问题,静态调用可能需要最少的 CPU 功率。原因是普通方法是动态绑定的,需要在运行时进行一些查找,而静态方法绑定在编译时。

话虽如此,它在您的应用程序中可能并不重要。差别真的很小。如果您的应用程序使用 gui、xml 渲染、互联网连接或其他外部操作进行任何操作,您会发现这些活动使简单的数学查找相形见绌。

即使您不这样做,在分析期间您也更有可能遇到阻碍应用程序的单一瓶颈,并发现它不是方法查找,而是您自己执行的一些逻辑。例如,您使用 arraylist 而不是 hashset,而 contains 方法变得很昂贵。

因此,由于这些情况下的性能并不重要,我建议使用静态方法之上的单例实现,因为设计更灵活一些。尽管在您提供的选择之外,我会完全放弃辅助类并将方法内联到您的 pojo 中。

【讨论】:

以上是关于静态方法或单例性能方面(Android)?的主要内容,如果未能解决你的问题,请参考以下文章

Android开发 关于静态static类与static方法持有Context是否导致内存泄露的疑问

单例类与静态方法和字段? [复制]

Android遇到内存泄漏和性能优化,需要采取以下措施

扎实基础_设计模式_结构型_单例模式

java 静态方法和单例模式的区别

单例模式与静态方法的区别