我一直在对 PHP 中访问大型(ish)数据数组的不同方法进行一些分析。用例非常简单:我们的一些工具将数据作为关联数组输出到 PHP 文件中,这些文件被应用程序视为静态数据。我们制作游戏,因此数据文件的一些示例将包括目录中的项目、用户必须完成的任务或地图的定义:
<?php
$some_data = array(
...lots and lots of stuff in here...
);
?>
由于这些数组非常大(400K),而且我们的大部分代码都对这些数据感兴趣,因此有必要尽可能高效地访问这些数据。我决定使用 3 种不同的模式来执行此操作。在介绍了这些方法之后,我将在下面分享我的结果。
我正在寻找的是对这些方法及其时机以及任何其他尝试方法的基于经验的验证。
方法一:getter 函数
在该方法中,导出器实际上创建了一个如下所示的文件:
<?php
function getSomeData()
{
$some_data = array(
...lots and lots of stuff here...
);
return $some_data;
}
?>
然后,客户端代码可以在需要时通过简单地调用 getSomeData() 来获取数据。
方法#2:全局+包含
在这种方法中,数据文件看起来与上面的原始代码块相同,但是客户端代码必须跳过几圈才能将数据放入本地范围。这假设数组在一个名为“some_data.php”的文件中;
global $some_data; //must be the same name as the variable in the data file...
include 'some_data.php';
这会将 $some_data 数组带入范围,尽管对于客户端代码来说有点麻烦(我认为)。
方法#3:通过引用获取
此方法与方法#1 几乎相同,但是 getter 函数不返回值,而是设置对数据的引用。
<?php
function getSomeDataByRef($some_data)
{
$some_data = array(
...lots and lots of stuff here...
);
return $some_data;
}
?>
然后,客户端代码通过声明一个局部变量(称为任何东西)并通过引用将其传递给 getter 来检索数据:
$some_data_anyname = array();
getSomeDataByRef(&$some_data_anyname);
结果
所以我运行了一个小脚本,运行这些方法中的每一种检索数据 1000 次,并平均运行时间(在开始和结束时由 microtime(true) 计算)。以下是我的结果(以毫秒为单位,在 MacBookPro 2GHz、8GB RAM、PHP 版本 5.3.4 上运行):
方法#1:
平均:0.0031637034416199 最大值:0.0043289661407471 最小值:0.0025908946990967
方法#2:
平均值:0.01434082698822 最大值:0.018275022506714 最小值:0.012722969055176
方法#3:
平均:0.00335768699646 最大值:0.0043489933013916 最小值:0.0029017925262451
无论如何,从这些数据来看,似乎很清楚 global+include 方法不如其他两个方法,这是“可以忽略不计”的差异。
想法?我完全错过了什么吗?(大概...)
提前致谢!