什么';s是“的性能成本”;包括「;在PHP中?

什么';s是“的性能成本”;包括「;在PHP中?,php,performance,php-include,Php,Performance,Php Include,只是想知道是否有人知道包含一个包含100个类文件的大型(600K或更多)php文件会带来什么“成本”。与自动加载单个文件(例如,在找到匹配项之前搜索多个目录)相比,它真的有很大区别吗 使用APC缓存是否会使成本可以忽略不计?APC将为您节省大量成本,但我不知道如果您的源代码为600k,成本是否可以忽略不计。大约15000行代码?对于一个网站来说没有那么多,但是对于一个文件来说相当大 您更希望在特定类中使用更动态的方法和特定于隔离的功能。然后,对于每个页面,您可以选择所需的代码 特别是当您使用AP

只是想知道是否有人知道包含一个包含100个类文件的大型(600K或更多)php文件会带来什么“成本”。与自动加载单个文件(例如,在找到匹配项之前搜索多个目录)相比,它真的有很大区别吗


使用APC缓存是否会使成本可以忽略不计?

APC将为您节省大量成本,但我不知道如果您的源代码为600k,成本是否可以忽略不计。大约15000行代码?对于一个网站来说没有那么多,但是对于一个文件来说相当大

您更希望在特定类中使用更动态的方法和特定于隔离的功能。然后,对于每个页面,您可以选择所需的代码

特别是当您使用APC时,这种方法会更好,因为您没有从磁盘加载许多小文件时所需的文件I/O开销。我会选择实现小的、指定的类,并将每个类放在一个单独的文件中。您可以使用PHP类加载机制(“自动加载”)自动加载正确的单元


当您为类和单元找到一个好的命名约定时,这将使您的开发更加容易。

基本上,包含一个大文件的成本取决于您的用例。假设您有一个包含200个类的大文件

如果只使用1个类,那么包含大文件的成本将高于包含单个类的小类文件的成本

如果您使用所有200个类,包括大文件,将大大低于包括200个小文件的成本

切断点的位置实际上取决于系统。我会想象它会在50%左右(如果在任何一个请求中使用的类少于100个,则自动加载)

使用APC可能会使盈亏平衡点更接近于更少的类(因此,如果不使用APC,使用100个类可能是盈亏平衡点,但使用APC可能会达到50个类),因为它使大型单个include更便宜,但只会稍微降低每个较小include的开销

确切的盈亏平衡点将100%取决于系统(磁盘I/O速度、处理器速度、内存大小等)。因此,在您的平台上确定的唯一方法是测试

然而,与其说是原始表现,还不如说是利害攸关。一个大文件会影响可维护性,因为同时处理多个类比较困难(IDE中的选项卡变得无用)。我个人会将所有类保存在单独的文件中,使我作为开发人员的生活更容易,而不是制作一个巨大的畸形文件


现在,如果你有facebook的流量水平,可能值得进一步调查。但是如果你不这样做,我个人就不会担心了…

我已经对php
include()
的各种成本进行了一些测试,我想与大家分享,因为我看到许多程序员或CMS平台忽视了这些运行前的php成本

函数本身的成本可以忽略不计。包括100个文件(含空文件)的成本约为5毫秒;使用opcache时,不会超过一微秒

因此,包含一个包含100个类的较大php文件(而不是包含100个单独的文件)的成本节约仅为5毫秒左右。而使用操作码缓存使得成本变得无关紧要

真正的成本取决于文件的大小,以及PHP必须解析和/或编译的内容。为了更好地了解这些成本是多少,下面是我在一台2010 Mac Mini服务器上进行的测试结果,该服务器有一个10000 RPM的驱动器,运行PHP5.3,带有一个支持优化器的eAccelerator opcache

1µs  for 100 EMPTY File includes, w/opcache
5ms  for 100 EMPTY File includes, no opcache

7ms   for 100 32KB File includes, w/opcache
30ms  for 100 32KB File includes, no opcache

14ms  for 100 64KB File includes, w/opcache
60ms  for 100 64KB File includes, no opcache

22ms  for 100 128KB File includes, w/opcache
100ms for 100 128KB File includes, no opcache

38ms  for 100 200KB File includes, w/opcache
170ms for 100 200KB File includes, no opcache
因此,一个600KB的php文件大约需要6ms,使用操作码缓存时大约需要1ms。您真正想看到的是每个请求包含的所有代码的大小

在组合中合并文件以尝试保存资源肯定不是一个好主意,在使用op缓存时可能是一个错误。我的测试并没有考虑到磁盘速度,因为我包含了100次相同的文件。也就是说,我觉得根本不需要涵盖磁盘I/O,因为安装op缓存是基本性能的先决条件

为了尽可能地提高性能并节省RAM使用,必须做相反的事情。这就是使用自动加载程序或类工厂模式,尽可能多地根据上下文分割文件,以便为每个请求包含尽可能少的未使用代码

因此,也可能对绩效产生负面影响

关于你的基类。我有类似的情况,但我只包含表模式的一小部分。主要是字段类型和主键详细信息。出于性能方面的原因,我故意不总是包含非常繁重的表模式,因为它们很少被使用,而且当它们被使用时,我在每个请求中最多只使用其中的两个


表的平均完整列详细信息约为每个模式数组20-50k。在任何给定的请求中包括10-15个,阵列的成本仅为1-3毫秒。这本身并不多。但是,当与每个请求节省500k RAM相结合时,这是值得的。

澄清一下,这将是ORM的“基类”。没有简单的方法可以通过“函数”来区分它们,它们只是数据库模式的表示。我们在每个“构建”上覆盖它们,目前我们为对象级和表级覆盖扩展了它们两次。对于任何给定的请求,我们都可能加载10-15个。在我的初始测试中,我发现加载完整文件和不加载文件之间没有明显的区别。我们确实启用了APC,所以这可能是其中的一部分?另外,如果您发现将所有内容放在一个大文件中可以大大提高速度,您可以为您的产品创建某种“编译”脚本