使用一份包含20K行代码的单个类时,会有"性能影响"。

10

这个问题曾经在这里被提出,但是没有一个答案真正尝试回答实际问题,所以我用不同的方式来提问。将一个具有100多个函数的20,000行代码的类加载是否比将代码分解为更小的类,并根据需要加载这些较小的类在任何方面都更耗费资源?


4
显然,这取决于使用情况。如果你将它们拆开,在实际使用中只用到其中的1%,并且只加载这个1%,那么它肯定比加载全部内容再使用其中1% 要更节省资源。 - houbysoft
1
你在这里询问了两件不同的事情。 "性能影响" 为零。虽然 "资源密集型",但是它确实会占用内存。如果你将代码分解成较小的部分,则将减少内存使用量,但最终会增加 I/O。使用 xdebug 而不是一般性建议。 - mario
3
在这里,性能不应是你关注的重点...你将获得的可维护性和能够阅读代码的好处远远超过可能出现的任何(可能较小的)性能影响。 - Thanatos
2个回答

6
较大的脚本或类会占用更多内存,每个实例都会使用。PHP原生并没有一种方法来共享库和类的内存空间,因此创建庞大的网站脚本不是一个好主意。通常的做法是将类分解为块,这样您只需要包含每个脚本运行所需的内容即可。
除非您有大量的流量,否则这不太可能导致性能问题 - 那时您可能比重构类更容易解决问题。
当加载脚本时,需要固定数量的内存来解析它。脚本越大,需要的内存就越多。接下来,执行脚本本身,运行任何顶级代码(不在类或全局函数中)。如果其中包括任何require/include语句,则会加载这些脚本(如果必要)。如果它创建对象,则需要更多内存。
但是,每个类实例的大小仅受其存储的数据影响。除了这个修正之外,这里的建议是正确的:根据职责拆分您的类。这样做的原因也与开发的便利性有关,而不仅仅是性能。假设您有一个充满静态方法的巨型类。如果您的应用程序对每个请求使用大多数这些方法,则拆分它将没有性能好处,因为两个脚本最终都会被加载。但是,如果您可以将方法分组到逻辑子系统中,则它们将更易于理解和使用。

同意。在将库拆分为单个类和文件之后,可以使用 PHP 5 的自动加载机制(autoload)来轻松实现这一点。 - Pekka
1
@Pekka,请不要提及A词。我正式讨厌它,因为我不太明白如何添加它。 - jblue
@jblue,你是在说“自动加载”吗?如果你遇到任何问题,有一些不错的教程可以参考。 - shamittomar
1
@jblue :) 但这真的很棒。对我来说,这是自面包片以来最伟大的发明,因为你不再需要包含()一堆东西,而且保证不会嵌入未使用的代码。也许这可以帮助你?http://stackoverflow.com/questions/2302912/whats-the-principle-of-autoloading-in-php 否则,也许可以就这个问题提出一个单独的问题? - Pekka

4

一个大的类需要一个周期才能编译成二进制代码(操作码)。

许多较小的类使用更少的内存,但需要更多的编译,而编译所使用的内存将被累积。

这真的取决于运行时包含了多少个类/文件。

因此,解决方案是将其分成多个类并使用APC或等效工具。

PS:如果您不愿意将大类分成较小的类,则大文件的内存消耗要小得多,因为PHP不需要重新将源代码编译为操作码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接