【问题标题】:"performance impact" when using a 20K lines single class使用 20K 行单类时的“性能影响”
【发布时间】:2010-12-26 19:52:38
【问题描述】:

之前有人问过这个问题here,但没有一个答案真的试图回答所问的实际问题,所以我以不同的方式问它。加载一个包含 20,000 行和 100 个函数的类是否比将代码分解为每个函数更少的小类并根据需要加载这些小类更耗费资源?

【问题讨论】:

  • 显然,这取决于用例。如果你把它们分解,最后只使用它的 1% 并只加载这 1%,当然它会比加载 100% 然后使用 1% 占用更少的资源。
  • 你在这里问两个不同的事情。 “性能影响”是zilch。虽然“资源密集”,是的,它是内存方面的。如果您将代码分解成更小的部分,那么您将使用更少的内存,但最终会增加更多的 I/O。使用 xdebug 而不是笼统的建议。
  • 性能不应该是您关心的问题...您将在可维护性和能够阅读代码方面获得的好处将大大超过可能发生的任何(可能很小的)性能影响。

标签: php performance oop code-size


【解决方案1】:

脚本或类越大,每个实例使用的内存就越多。开箱即用,PHP 没有办法共享库和类的内存空间,因此为网站创建大量脚本并不是一个好主意。

典型的方法应该是将类分解成块,这样您只需要在每个脚本中包含运行该脚本实际需要的内容。

此外,除非您有大量流量,否则不太可能导致性能问题 - 然后您可能会比重构类更容易解决问题。

加载脚本时,它需要固定数量的内存来解析它。它越大,它需要的内存就越多。接下来,执行脚本本身,运行任何顶级代码(不在 类或全局函数)。如果其中包含任何 require/include 语句,则会加载这些脚本(如有必要)。如果它创建对象,则会占用更多内存。

但是,类的每个实例的大小仅受其存储的数据的影响。除了这个更正之外,这里的建议是:根据职责划分你的班级。其原因也与易于开发而不是性能有关。假设您有一个充满静态方法的怪物类。如果您的应用程序对每个请求都使用这些方法中的大部分,那么拆分它不会有任何性能优势,因为这两个脚本最终都会被加载。但是,如果您可以将这些方法分组到逻辑子系统中,它们将更易于理解和使用。

【讨论】:

  • 同意。 PHP 5 的autoloading 是一种可以简化此操作的机制(在您将库分解为单个类和文件之后)。
  • @Pekka,请不要提及A字。我正式讨厌它,因为我不太明白如何添加它。
  • @jblue,你说的是“自动加载”吗?如果您遇到任何问题,这里有一些不错的教程。
  • @jblue :) 但它真的很棒。对我来说,这是自切片面包以来最棒的事情,因为您不再需要 include() 东西,并且保证不会嵌入未使用的代码。也许这有帮助? stackoverflow.com/questions/2302912/… 否则,也许可以就这个问题提出一个单独的问题?
【解决方案2】:

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

许多较小的类使用较少的内存但需要更多的编译,并且编译使用的内存会累积。

实际上取决于运行时包含多少类/文件。

所以,解决这个问题,分成多个类并使用APC 或等效项。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多