【问题标题】:How expensive is the include/import directive? [duplicate]包含/导入指令有多贵? [复制]
【发布时间】:2012-11-27 15:49:02
【问题描述】:

可能重复:
cost of “include” in PHP?

这个问题专门针对PHP,但我很确定他的回答本质上与大多数支持类(至少是解释类)的现代编程语言相似。

当你include 或使用一个类时(使用namespaces for PHP >= 5.3.0),会花费多少处理资源?

例如,假设有一个包含数千行代码的大型 PHP 脚本文件 Database.php,然后您将其导入另一个脚本:

# PHP >= 5.3.0
use Service\Database;

# in previous versions
include Service/Database.php;

我不确定在这种情况下幕后会发生什么。它是将类 all 加载到工作内存中还是仅将您实际使用的功能加载到工作内存中?如果你导入它但不使用它,它是否仍然浪费资源?

【问题讨论】:

  • 如果您认为您正在尝试优化您的代码,请停止。打破xdebugxhprof 并进行真实分析。使用这些工具来识别代码中真正的 性能问题。如果您认为包含的文件正在伤害您,请仅在可以证明这一点后才担心。在那之前,不要担心。 (嘘,字节码缓存,查一下。)

标签: php include


【解决方案1】:

这个问题是针对 PHP 的,因为其他语言在解析器中的工作方式完全不同。

第二条评论:use 不包含任何内容,因此不能替代include/require

第三条评论:因为将 PHP 源代码包含到脚本中需要将代码解析为操作码,然后再进行解释,所以有操作码缓存可以在第一次之后消除这一步。这些大大提高了性能。

会发生什么?包含一个文件会执行该文件。这意味着源被解析或从缓存中获取,然后执行。定义某些内容的每一行代码,例如classfunction,将为后面的代码行定义其部分。执行某些操作(例如定义变量或echo)的每一行都会执行并按预期执行。

Include 不是随后被解析的源代码包含。因为代码是执行的,而不是作为源代码粘贴的,所以你不能在任何地方使用include。事实上,include 本身可以作为一个函数,如果包含的代码返回一个值。这通常用于包含配置值,以从操作码缓存中受益,而不是一直解析 INI 文件:

config.php
return array('db' => 'example.com', 'user' => 'foo',);

other file:
$config = include('config.php);

【讨论】:

  • 我不知道将包含用作自身的函数,这很酷。但是如果use 指令实际上不包含任何内容,那么它们会做什么?他们是将类加载到内存中还是只是创建一个别名来引用该类?
  • 他们将其他命名空间中的类和接口导入到你的命名空间中。
猜你喜欢
  • 2015-04-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2017-01-13
  • 2019-03-27
  • 2010-10-08
相关资源
最近更新 更多