1

这是我无法解释的非常奇怪的事情,但可能你们中的一些人已经发现了相同或类似的问题?

想象一下下面的伪 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 语句来确定 column 中是否有内容my_name。如果有,它将打印它,如果没有,它将打印id代替。

现在奇怪的部分是,在 Debian Linux 虚拟机上,在 ESX5 上运行,这个速记 if 比普通if{}else{}语句长 10 倍。

因此,在我的例子中(迭代 5000 条记录)不是 3 秒,而是在这个特定的 VM 上需要 30 秒 - ESX4 Debian 主机上的相同代码运行得很好。

如果我用普通的 IF 语句替换速记 IF,一切都很好。

我在互联网上做了一些研究,但找不到解释。您将从哪里开始搜索问题?

谢谢!// 马库斯

4

2 回答 2

1

好吧,我的错 - 我应该先阅读有关三元运算符的手册,然后再“从我的脑海中”使用它们......

我将运算符更改为正确的格式,如 评论中提到的Acyclic TauMTilsted :

$output .= ($row[1] ? $row[1] : $row[0]);

奇怪的速度问题消失了——但是下一个问题是为什么 PHP 没有因为语法错误而抛出异常?

于 2013-11-05T16:25:46.450 回答
0

我相信三元运算符(?)和 IF 语句之间存在根本区别(如此处所述http://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not)总结基本上是:

三元运算符的速度与复制语句结果所需的时间直接相关,即使它不是严格需要的。复制一个包含 100000 个元素的数组需要时间。

这是因为三元运算符将值复制到新的内存位置,而 if..else 块可能不会。

虽然这可以解释单个 VM 实例上的速度差异,但它并不能充分解释为什么两个 VM 都使用三元运算符时速度不同。假设您使用的两个虚拟机位于不同的硬件上。您是否有可能使用不同版本的 PHP?两个主机之间的底层处理器不同并且影响内存副本的处理速度?

于 2013-11-05T14:18:56.530 回答