“清洁代码”对性能的影响

时间:2009-11-27 14:45:33

标签: php performance refactoring separation-of-concerns

在我的工作场所,我们正在计划对我们的核心产品进行重大改造,这是一个带有多个“模块”的Web应用程序。我引用了这一点,因为这是我们主要关注的问题之一:模块不是真正的模块,整个事情是单片的。该应用程序使用PHP编写,具有智能模板并使用Pear访问MySQL数据库。我们并不真正关心数据库的独立性,尽管如果不花费数月的时间来实现它会很好。

我们主要担心的是开发时间/成本呈指数级增长,因为错误在不相关的地方突然出现,并且没有合理的通用架构来依赖于获得最常见的功能(每个模块基本上都是复制/粘贴的。一,然后适应)。

我对web MVC原则有一些经验,主要是在ASP.NET MVC中。我喜欢它提供的清洁分离和可测试性。但是,在本地计算机上尝试此操作时,应用程序的速度应该比它应该慢得多。

好的,足够的介绍,关于问题: - 我应该依赖缓存模块吗?这是否使用良好的架构提供了大部分开销?像APC这样的东西。

  • 主要阅读申请表。写入主要是单个值(更改记录中的单个字段)。 PHP的任何OR / M都擅长这个?
  • 还在寻找灵活的MVC框架。我知道Zend,CakePHP,也许是Symfony?

棘手的部分是我们没有能够完全重写的奢侈。我们必须逐步改进目前非常混乱的代码库。这必须在编写新代码或修复错误时完成。我真正想要做的一件事就是在修复之前为新bug写一个回归测试,以防止它在以后再次出现(偶尔会发生这种情况)。

我正在考虑的堆栈包含:

  • MVC框架的选择
  • 记录(log4php?)
  • 选择的OR / M(不必是动态的,代码生成也很好)
  • 选择IoC容器
  • Smarty Templating,也许是抽象的,所以我们可以在需要时将其切换出来。
  • 选择操作码缓存(我们现在使用一个,忘了哪一个,要问系统管理员)

让我担心的主要问题是在PHP中创建干净代码的性能影响。看到它是一种与.NET / Java Web堆栈相对的解析语言,为其他内联代码创建抽象(在不同文件中强制分离)可能会在另一个层面上产生新问题。


注意:如果您想出更合适的标签,请重新标记,我不确定当前标签。

5 个答案:

答案 0 :(得分:3)

通常,设置干净并不是性能问题。大多数性能都花费在您正在与之交谈的数据库或其他外部系统上。

除了这些通常有一两个热点可能值得优化,但为此你应该从干净的设计开始,然后使用分析器(如XDebug或ZendDebugger)来识别瓶颈。

通过“优化”设计,干净的软件设计比0.01%的性能提升更为重要。通常,购买和运行更多硬件的成本甚至比担心无法维护的“优化”代码库更便宜。

答案 1 :(得分:2)

我强调预算编制时间,并给管理层提供以下论据:

  1. 当开发人员修复错误时,允许他们为错误编写测试。错误比它们可能应该更频繁地再次发生,这是一种廉价而有效的方法来完全阻止它。
  2. 当开发人员构建新功能时,允许他们在其下编写测试。由于他们完全熟悉当时的功能,因此构建自动化测试的“安全网”是最便宜的时间。
  3. 不要糖衣大衣测试会花多长时间;无论是1%的时间还是50%,都要直接告诉经理,但强调建立自动化测试作为安全网会阻止用户遇到很多错误,并且会为开发人员节省开发时间而不是错误修正。 / p>

答案 2 :(得分:2)

就使用意大利面条代码组件管理MVC组件而言,我们遇到了与大型项目类似的问题。什么运作良好只是采取一个目录,并使其成为MVC应用程序的新docroot(在我们的案例中为Zend Framework),以便:

旧部分:
http://site.com/data.php
http://site.com/other.php

新部分: http://site.com/app/controller/action/ ...

重新验证,您有几个选择。最合乎逻辑的是将login.php脚本重定向到MVC登录,然后将其传递回原始页面,并将其作为GET参数传递给必要的信息。这将允许旧系统和新系统同时且透明地存在。

再慢,在我拿出XDebug之前,我会尝试隔离一个有问题的部分,只需输出所需的时间。恕我直言。

答案 3 :(得分:1)

在数据库驱动的Web应用程序中,结构良好的面向对象代码的性能要比sapghetti php代码差得多。您需要进行一些分析以找出瓶颈所在并进行相应优化。

答案 4 :(得分:0)

你确实有一个艰难的(但并非罕见的)情况。

至于组织代码以尽量减少错误,我所能给出的只是DRY上限的一小部分。

对于性能问题,这些很容易找到,因为它们非常缓慢地向您显示by this technique