我有一个定制的 MVC PHP 框架,我正在重写它,并且对性能和魔术方法有疑问。对于框架的模型部分,我在想__get
/__set
魔术方法是否会导致太多的性能损失值得使用。我的意思是访问(读取和写入)模型数据将是最常见的事情之一。对于像 MVC 框架的模型部分这样的重度使用功能来说,使用__get
/__set
魔术方法对性能的影响太大了吗?
4 回答
测量它。
它肯定会对性能造成很大影响,尤其是考虑到 PHP 中的函数调用成本很高。在 PHP 的下一个版本中,这种差异会更大,它实现了优化,可以显着加快对声明的实例属性的定期访问。
也就是说,PHP 很少是瓶颈。I/O 和数据库查询经常需要更多时间。但是,这取决于您的使用情况;确定它进行基准测试的唯一方法。
这也是魔术方法的其他可读性问题。它们经常退化为一个大switch
语句并损害代码完成,这两者都可能会影响编程效率。
这是一篇带有一些基准的文章(三年前)。运行您自己的测试以查看它如何影响您的代码。
一般来说,它们要慢得多。但他们是瓶颈吗?这取决于你在做什么。如果您担心速度,它会停在哪里?循环比foreach
循环慢for
,但大多数人不会重写所有代码来使用for
.
仅使用 PHP 意味着您的代码速度并不是那么关键。就个人而言,我更喜欢任何能让编程更容易的风格。
纯粹根据我的经验,它确实增加了很多开销。在大约 4000 的页面上__get
(是的,该页面上有相当多的数据)性能相当慢,以至于它变得不可接受。对于不需要更改其他数据或检查外部依赖项(如外键)的变量,我丢弃了所有__set
's & 's,之后生成该页面的时间大约是它所花费时间的 15%__get
前。
我刚刚问了自己同样的问题并得出了同样的结论:最好以传统方式设置属性。__get() + 大开关减慢一切