【问题标题】:OOPS, there goes the performance?哎呀,表演结束了?
【发布时间】:2009-02-19 17:50:43
【问题描述】:

我正在开发用 php/mysql 编写的网站。当我第一次写它时,它是意大利面条,在 html 中嵌入了很多 php 之类的东西——很难维护。

我用 OOPS 用一个很好的模块化结构重写了整个东西,现在它更容易维护和扩展。

但在使用 webwait 和 siege 测试网站性能时,更新、结构更好的版本似乎比意大利面条代码版本运行和加载更慢。

加载时间相差近 1 秒 - 2.39 秒与 3.81 秒

除了 php 代码之外没有其他任何更改 - 不是 js,不是 css

那么这里的问题是什么?我应该恢复到旧代码吗?其他人也遇到过这种情况吗?

编辑:

  • 我已经使用 cachegrind,包括在内,我认为 代码很不错。
  • 我也 知道问题不完全 哎呀,但更大的结构等。 而且OOP根本没有 保证更好的性能。
  • 我也多次运行代码。
  • 我使用过 cachegrind kcachegrind,包括,围攻(大部分 Rasmus lerdorf 中概述的工具 他在 2008 年的 drupalcon 上的演讲'Simple is Hard')

我想知道的是其他人如何处理这个问题。

【问题讨论】:

  • 老系统的加载时间已经显得太大了。也许数据库没有正确索引。使用分析器找出原因并让页面在几十毫秒内加载。
  • 检查它是否只是看起来像 OO 的过程代码。我已经看到这种情况发生了,而且最常见的是它糟糕的 OO 会杀死
  • PHP 的 OOP 性能并不好,尤其是当您将其与 .NET 或 Java 进行比较时。幸运的是 PHP 5.3 或更高版本,6.0 将提供一些速度改进,但不是灵丹妙药。

标签: php oop


【解决方案1】:

“我应该恢复到旧代码吗?”

如果我说 revert,你会说“看,我知道 OO 是一个失败的单元,没有人可以制作一个有效的 OO 应用程序。”那是错误的。

如果我说不要还原,你会说,“但它的速度慢得让人无法接受。”

那么,还剩下什么?

你必须把它写得更好。直走。重写您的 OO 以使其真正起作用。 OO 不是“魔法”——它不能保证任何事情。有不好的 OO 程序和好的 OO 程序。就你而言,你显然还有改进的余地。

因此,请获取一些性能分析工具并找出时间都花在了哪里。

另外,不要“优化”——重写。

很有可能您正在进行某种需要大量时间的搜索。消除搜索。使用更好的容器和集合(哈希映射、集合等)

【讨论】:

  • +1 - 可维护性和性能是正交的 - 一个并不意味着另一个,反之亦然
【解决方案2】:

分析代码。我不知道在 PHP 中是如何做到这一点的,但这是弄清楚发生了什么的唯一合理方法。

有时让代码更优雅会对性能产生不利影响,但通常不会到那种程度。你需要弄清楚时间的去向,然后解决这个问题。

【讨论】:

【解决方案3】:

我能想到几点需要考虑:

  • 这不是 OOP 与意大利面条代码的选择。还有其他范式可能与 OOP 一样可维护和结构化,但具有不同的性能特征。可以只使用简单的过程语言特性来编写 OOP 代码(许多大型 C 框架使用非常 OOP-ey 的风格。)在某些情况下,功能性更强的风格也可能更简单。 OOP 不是一个真正的范式。
  • 存在不同程度的 OOP。在大多数语言中,将数据建模为对象不会导致明显的性能差异(虽然我不知道 PHP 在这方面的表现如何,但我总是认为 PHP 是最糟糕的)。但是,虚函数、继承(尤其是多重继承)速度较慢,并且会增加通常可以避免的开销。您使用哪些 OOP 功能?是否有更简单的 OOP 设计可以完成这项工作,但对“慢”语言特性的依赖较少?

最重要的是,通常情况下显然适用(您能否优化算法、启用缓存或预编译等等 - 虽然这些可能有很大帮助,但它们并不特定于 OOP)

【讨论】:

    【解决方案4】:
    There's a difference of nearly 1 second in loading time - 2.39s vs 3.81s
    

    这是 3.81-2.39 = 1.42s 的差异,超过较小值的 50%,所以在我看来这不是一个小数字。您是否多次运行测试,以便正确摊销初始编译/解释成本?您是否考虑过尝试引入计时器以查看比以前花费更多时间的地方?这些将是我的建议,因为您似乎已经引入了很多抽象并且现在看到了它的代价。

    【讨论】:

      【解决方案5】:

      尝试设置Xdebug,看看它能告诉你什么。其他人提到您应该使用分析器检查它。我同意,Xdebug 可以为您提供一个以及其他一些有用的功能。您选择的 IDE 甚至可以与 Xdebug 集成。

      【讨论】:

        【解决方案6】:

        要考虑的一件事:您使用的是APC 还是其他一些PHP 操作码缓存解决方案?如果没有,每次加载页面时,您的所有代码都会从头开始重新解释。这肯定会影响性能。

        【讨论】:

        • 但是相对的性能差异应该是一样的吧?
        • 不一定,您的新 OO 代码可能需要比以前的代码更复杂的解释。
        • 不一定。 APC 抵消了 include() 和 require() 的成本,但不会使实际计算加载更快。 OO 应用程序很可能必须在每个页面上包含更多代码,即使它从未运行过。
        【解决方案7】:

        OOP 意味着大量的函数调用,而动态语言中的函数调用很慢。 因此,将旧代码“翻译”成 OOP 版本会减慢它的速度。做一个完整的重写。

        【讨论】:

        • 你能解释一下我在重写过程中应该关注什么吗?
        • 不要创建过多的类。尤其不要创建仅在其中一种方法中使用的类。无论如何,正如已经说过的,OOP 不会让您的代码运行得更快。它使开发和维护更加可靠和容易。加速使用APC(可以缓存一些对象)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 2020-04-22
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        相关资源
        最近更新 更多