这是我无法解释的非常奇怪的事情,但可能你们中的一些人已经发现了同样或类似的问题?
想象一下以下伪PHP代码:
<?PHP
mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("mydb");
$result = mysql_query("SELECT id, my_name FROM my_table");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$row[1] ? echo $row[1] : echo $row[0];
}
mysql_free_result($result);
?>
这基本上只是查询mySQL服务器并遍历所有记录集。
然后,它使用“简写”if语句来查明列my_name
中是否存在某些内容。如果有,则会打印出来,否则会打印id
。
现在奇怪的部分,在Debian Linux虚拟机上,在ESX5上运行这个速记,如果比普通的if{}else{}
语句长10倍。
因此,在我的情况下(迭代5000条记录)而不是3秒,这个特定的VM需要30秒 - ESX4 Debian主机上的相同代码运行正常。
如果我用正常的IF语句替换速记IF,一切都很好。
我在互联网上做了一些研究,但找不到解释。 你会从哪里开始寻找这个问题?
谢谢! // Markus
答案 0 :(得分:1)
好吧,我的错 - 我应该阅读有关三元运算符的手册,然后再“使用它们”......
我将操作符更改为正确的格式,如评论中提到的非循环Tau 和 MTilsted :
$output .= ($row[1] ? $row[1] : $row[0]);
奇怪的速度问题已经消失 - 但接下来的问题是为什么PHP因为语法错误而没有抛出异常?
答案 1 :(得分:0)
我认为三元运算符(?)和IF语句(如此处所述http://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not)之间存在一个有趣的区别,总和基本上是:
三元运算符的速度与复制语句结果所花费的时间直接相关,即使不是严格需要的也是如此。复制100000个元素的数组需要时间。
这是因为三元运算符将值复制到新的内存位置,而if..else块可能不会。
虽然这可以解释VM单个实例的速度差异,但它并没有充分解释为什么两个VM在使用三元运算符时速度不同。 假设您使用的两个VM位于不同的硬件上。您是否可能使用不同版本的PHP?底层处理器在两台主机之间是不同的,并且正在影响内存副本的处理速度吗?