2010-10-13 94 views
4

在对个人宠物项目进行了一些分析后,我正在玩弄一些愚蠢的微观优化。这主要是一个实验,而不是其他任何事情,所以我调整的东西实际上并不需要调整。这仍然是一个有趣的练习。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.

+0

我假设这是运行多次,在不同的时期,也就是说环境因素在这里并没有扮演很重要的角色?它看起来像一个不寻常的区别,这是在CLI下吗?你可以尝试与在同一OSX安装中安装5.2进行比较吗? – Fanis 2010-10-13 19:13:13

+0

是的, Fanis,我确定我运行了数十亿次,发现它在两台机器上都是100%可重复的,结果在两台机器上都是一样的,无论它是通过CLI还是apache2/mod_php运行,我也运行过它在这两种模式下都可以验证这一点我不确定在OS X机器上切换到5.2是非常容易的,因为我有相当多的5.3工作要做ATM并且破坏我的主开发环境是不可能的。 – Shabbyrobe 2010-10-14 02:29:51

+0

但除此之外,你的两个代码并不是真的做同样的事情。测试'is_array($ x)'和'$ x!='Array'&&(string)$ x =='Array''会更精确。 (因为数组不是PHP中唯一的非字符串类型...) – NikiC 2010-10-18 10:28:44

回答

0
  1. 请测试1个秒钟minumum,就分0.1秒时限内核调度差异(和数十个其他原因)可能会影响您的结果。

  2. 检查是否有意外安装的加速器(APC,eAccelerator,e.t.c) - 只需比较两个实例中的phpinfo(),就会看到。

+0

我更新了问题以反映测试超过一秒钟的建议,但它没有改变结果。 APC安装在两台机器上 - 如果没有它,我永远不会离开家。随后在同一台机器上运行相同的脚本会产生几乎相同的结果,这表明操作码缓存与它无关,但我将它关闭并再次运行。 – Shabbyrobe 2010-10-18 13:35:59

+0

在Ubuntu和OS X上启用或禁用APC的时间没有区别 – Shabbyrobe 2010-10-18 13:45:28

+0

那么,两台PC具有相同的高速缓存大小相同的CPU吗? – BarsMonster 2010-10-18 14:04:13

1

Ubuntu安装与OS X安装位于同一台PC上吗?

它可能与zts有关。

尝试在两个系统上用相同的标志自己配置它。 默认情况下,可能会在ubuntu上启用默认情况下在端口中禁用的选项。

我不知道究竟是哪个,但是你的phpinfo()会告诉你。如果没有(也许phpinfo没有显示,也许它只是显示一个空白页面;那么也许你的系统之一正在编译与Susoshin补丁(或其他)

+0

ubuntu安装在另一台计算机上的虚拟机上运行。我会尝试配置的东西,看看它是否处理差异。这两台机器都没有suhoshin。 – Shabbyrobe 2010-11-01 11:08:35

+0

我会说:尝试在相同的规格下运行它,但我认为虚拟机应该有更低的性能......所以我印象深刻 – ssice 2010-11-01 15:15:50