OOPS,表现如何?

时间:2009-02-19 17:50:43

标签: php oop

我正在使用php / mysql编写的网站上工作。当我第一次写这篇文章的时候,它是用html等嵌入了大量php的意大利面 - 非常难以维护。

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

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

装载时间差异接近1秒 - 2.39秒vs 3.81秒

除了PHP代码之外没有其他任何改变 - 不是js,而不是css

那么这里有什么问题?我应该恢复旧代码吗?这是否发生在其他人身上?

编辑:

  • 我使用了一些分析 cachegrind,包括和我认为 代码非常好。
  • 我也是 知道问题并不完全 OOPS但更大的结构等 并且OOP根本没有 保证更好的表现。
  • 我也多次运行代码。
  • 我用过cachegrind kcachegrind,包括,围攻(大部分 Rasmus lerdorf概述的工具 他的drupalcon 2008谈论'Simple is Hard'

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

7 个答案:

答案 0 :(得分:14)

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

如果我说恢复,你会说“看,我知道OO是一个被炸的单位,没有人可以制作一个有效的OO应用程序。”那是错误的。

如果我说不回复,你会说,“但它的速度慢得令人无法接受。”

那么,还剩下什么?

您必须将其写为更好。直走。重写你的OO,以便它真正起作用。 OO不是“魔术” - 它不保证任何东西。有糟糕的面向对象程序和良好的面向对象程序。在你的情况下,你显然还有改进的余地。

因此,请获取一些性能分析工具,找出时间已经过去的地方。

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

你可能会花费大量时间进行某种搜索,这种情况非常好。消除搜索。使用更好的容器和集合(哈希映射,集合等)

答案 1 :(得分:6)

配置代码。我不知道如何在PHP中做到这一点,但这是解决正在发生的事情的唯一合理方法。

有时使代码更优雅会对性能产生不利影响,但通常不会达到这种程度。你需要找出时间在哪里,并解决这个问题。

答案 2 :(得分:1)

There's a difference of nearly 1 second in loading time - 2.39s vs 3.81s

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我可以考虑几点要考虑:

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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