在对个人宠物项目进行了一些分析后,我正在玩弄一些愚蠢的微观优化。这主要是一个实验,而不是其他任何事情,所以我调整的东西实际上并不需要调整。这仍然是一个有趣的练习。Ubuntu和Macports版本的PHP之间奇怪的性能差异
无论如何,我遇到了一个奇怪的性能差异,我通过Macports在OS X上安装PHP 5.3,在apt上安装在Ubuntu上。
看起来下面的代码显示了OS X上两个不同版本之间的巨大速度差异,但Ubuntu上只有极小的速度差异。
$x = array(9);
// As per BarsMonster's comment, this ensures it runs for more
// than a second in order to avoid possible kernel scheduler differences
$count = 10000000;
$s = microtime(true);
for ($i=0;$i<$count;$i++) {
$q = is_string($x);
}
var_dump(microtime(true)-$s);
$s = microtime(true);
for ($i=0;$i<$count;$i++) {
// This is obviously only useful if you'll never need a string
// with 'Array' in it here
$q = (string)$x!='Array';
}
var_dump(microtime(true)-$s);
在OS X上运行时,输出:
float(17.977133989334)
float(4.2555270195007)
在Ubuntu上运行时,输出:
float(5.2112979888916)
float(3.4337821006775)
这并不让我感到吃惊地看到,人物的黑客攻击up cast的版本非常相似,但是is_string方法是非常不同的。
我可以将此归因于什么?如果性能在安装和安装方面的差异非常大,那么我该如何信任使用与我的目标部署平台不匹配的操作系统的性能分析结果?
没有与APC或关闭两个Ubuntu的运行时,在时间没有差别和OS X.
我假设这是运行多次,在不同的时期,也就是说环境因素在这里并没有扮演很重要的角色?它看起来像一个不寻常的区别,这是在CLI下吗?你可以尝试与在同一OSX安装中安装5.2进行比较吗? – Fanis 2010-10-13 19:13:13
是的, Fanis,我确定我运行了数十亿次,发现它在两台机器上都是100%可重复的,结果在两台机器上都是一样的,无论它是通过CLI还是apache2/mod_php运行,我也运行过它在这两种模式下都可以验证这一点我不确定在OS X机器上切换到5.2是非常容易的,因为我有相当多的5.3工作要做ATM并且破坏我的主开发环境是不可能的。 – Shabbyrobe 2010-10-14 02:29:51
但除此之外,你的两个代码并不是真的做同样的事情。测试'is_array($ x)'和'$ x!='Array'&&(string)$ x =='Array''会更精确。 (因为数组不是PHP中唯一的非字符串类型...) – NikiC 2010-10-18 10:28:44