【发布时间】:2011-07-04 01:54:37
【问题描述】:
我在这里发现了一个类似的问题: Performance: condition testing vs assignment
这个问题与优化无关。这是关于编码偏好。
这是一个例子:
我有我无法控制的数据。它来自第 3 方,以 db 表中的行的形式出现。这是 MSSQL SP 的结果。由于臃肿,我想在通过网络将数据作为 JSON 传输之前减小它的大小。由于大部分数据都是重复的,因此我可以将其缩小 80%。
所以我会这样做:
$processed = array();
foreach ($result as $row)
{
$id = $row['id'];
$processed[$id]['title'] = $row['title'];
$processed[$id]['data'] = $row['data'];
$processed[$id]['stuff'] = $row['stuff'];
/* many more assignments with different keys */
$unique = array();
$unique['cost'] = $row['cost'];
/* a few more assignments with different keys */
$processed[$id]['prices'][$row['date']] = $unique;
}
我认为这可能会更快,但它看起来更慢(我计时了):
$processed = array();
$id = null;
foreach ($result as $row)
{
if ($id != $row['id'])
{
$id = $row['id'];
$processed[$id]['title'] = $row['title'];
$processed[$id]['data'] = $row['data'];
$processed[$id]['stuff'] = $row['stuff'];
/* many more similar lines */
}
$unique = array();
$unique['cost'] = $row['cost'];
/* a few more similar lines */
$processed[$id]['prices'][$row['date']] = $unique;
}
任何人都可以确认使用 PHP 的“if”或条件确实比分配更需要计算吗?谢谢。
[我作为编辑的回答]
我对使用 IIS 运行的 FastCGI PHP 进行了一些独立测试(没有真实数据或其他代码开销):
function testif()
{
$i = 0;
while ($i < 100000000)
{
if (1 != 0) /* do nothing */;
$i++;
}
return "done";
}
第一次运行: 20.7496500015256748 秒。
第二次运行: 20.8813898563381191 秒。
function testassign()
{
$i = 0;
while ($i < 100000000)
{
$x = "a 26 character long string";
$i++;
}
return "done";
}
第一次运行: 21.0238358974455215 秒。
第二次运行: 20.7978239059451699 秒。
【问题讨论】:
-
这在我看来像是过早的优化。与数据库请求和来回流动的数据相比,您的
if与分配性能将是九牛一毛。优化数据库和网络,不是if语句。 -
不确定问题的答案是什么(我认为它不会减慢速度),但是您不能轻松地计算代码执行所需的时间,然后尝试更改吗?跨度>
-
@mellamokb:杯水车薪是相当重要的;然而,沧海一粟……
-
@mellamokb,如果可以进行其他优化,现在还为时过早。事实上,这是针对网络传输进行优化的。我实际上并不关心这个实现。我想知道是否有人真的知道可以证实我的发现的 cpu 时间。
-
过早优化 = 邪恶
标签: php performance conditional variable-assignment