-1

也许这是一个愚蠢的问题,但什么更快?

<?php

function getCss1 ($id = 0) {
    if ($id == 1) {
        return 'red';
    } else if ($id == 2) {
        return 'yellow';
    } else if ($id == 3) {
        return 'green';
    } else if ($id == 4) {
        return 'blue';
    } else if ($id == 5) {
        return 'orange';
    } else {
        return 'grey';
    }
}

function getCss2 ($id = 0) {
    $css[] = 'grey';
    $css[] = 'red';
    $css[] = 'yellow';
    $css[] = 'green';
    $css[] = 'blue';
    $css[] = 'orange';
    return $css[$id];
}

echo getCss1(3);
echo getCss2(3);
?>

我怀疑 if 语句更快,但我更喜欢问!

4

9 回答 9

6

getCss1(if 语句)大约是我的基准测试的两倍getCss2(数组访问)。

结果来自microtime()

getCss1 called 10,000 times in 0.016569852828979 seconds
getCss2 called 10,000 times in 0.037255048751831 seconds

根据评论,我同意使用翻译数组的可维护性。$css考虑到函数开销和数组重新声明的消除,直接访问速度明显更快。

getCss1 called 10,000 times in 0.016607999801636 seconds
$css accessed 10,000 times in 0.0026898384094238 seconds

注意:在 Mac OS X 10.8 上运行 PHP 5.3.15。我还改变了调用顺序$id来测试执行路径。

于 2012-11-15T22:46:05.597 回答
3

我用它计时:

$t = microtime(true);
for($i = 0; $i < 10000000; $i++){
    getCss1(3);
}
echo "getCss1: ".(microtime(true) - $t)."\n";

$t = microtime(true);
for($i = 0; $i < 10000000; $i++){
    getCss2(3);
}
echo "getCss2: ".(microtime(true) - $t)."\n";

如果在 getCss2 函数之外定义 $css,并使用全局 $css,该函数仍然比 getCss1 慢,但比之前的版本快很多:

$css[] = 'grey';
$css[] = 'red';
$css[] = 'yellow';
$css[] = 'green';
$css[] = 'blue';
$css[] = 'orange';
function getCss3 ($id = 0) {
    global $css;
    return $css[$id];
}

$t = microtime(true);
for($i = 0; $i < 10000000; $i++){
    getCss3(3);
}
echo "getCss3: ".(microtime(true) - $t)."\n";

结果(Windows 7,AMD Phenom II:3.6Ghz,PHP 5.3.3):

getCss1: 3.7735629081726
getCss2: 14.683212995529
getCss3: 4.2553169727325

使用不同的 $id:

$id = 6:

getCss1: 4.2732820510864
getCss2: 32.388185024261
getCss3: 20.429337024689

$id = 0:

getCss1: 4.3480041027069
getCss2: 14.638042926788
getCss3: 4.2784569263458

因此,if 的速度似乎与值的位置完全无关,而在访问“低”键时,数组访问要快得多。

于 2012-11-15T22:55:32.380 回答
1

以下是如何计时!

将这两个函数保存在一个文件中。定义函数后,在一个上启动计时器,然后在另一个上启动。例子:

// Run function 1
$time_start1 = microtime();
getCss1 (2);
$time_end1 = microtime();
$time1 = $time_end1 - $time_start1;

echo "getCss1 function executed in $time1 seconds\n";

// Run function 2
$time_start2 = microtime();
getCss2 (2);
$time_end2 = microtime();
$time2 = $time_end2 - $time_start2;

echo "getCss2 function executed in $time2 seconds\n";
于 2012-11-15T22:47:57.723 回答
1

第二个函数可能较慢的唯一原因是访问内存需要时间。但是,数组可以存储在处理器的缓存中,这样时间会大大减少。此外,第二个函数在调用堆栈中的跳转次数更少。

理论上没有办法说,因为它取决于当前的机器配置和处理器架构。

如果您进行速度测试,请务必进行多次测试并比较平均速度值...

于 2012-11-15T22:54:07.380 回答
1

不要忘记 getCss1(3) 总是要检查 3 个条件。getCss(3) 必须在位置 3 处获取数组的值...

明确地:访问数组更快..

这是我的测试应用程序:

function getCss1($id = 0) {
  if ($id == 1) {
    return 'red';
  } else if ($id == 2) {
    return 'yellow';
  } else if ($id == 3) {
    return 'green';
  } else if ($id == 4) {
    return 'blue';
  } else if ($id == 5) {
    return 'orange';
  } else {
    return 'grey';
  }
}

function getCss2($id = 0) {
  static $css;
  if ($css === null) {
    $css[] = 'grey';
    $css[] = 'red';
    $css[] = 'yellow';
    $css[] = 'green';
    $css[] = 'blue';
    $css[] = 'orange';
  }
  return $css[$id];
}

$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
  $x = getCss1($i%6);
}
$end = microtime(true);
echo 'getCss1: ' . ($end-$start) . "\n";

$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
  $x = getCss2($i%6);
}
$end = microtime(true);
echo 'getCss2: ' . ($end-$start) . "\n";
于 2012-11-15T23:21:00.157 回答
0

速度应该取决于 的值,$id因为如果它是 6,它将遍历所有 if 语句,而从数组中获取索引值可能会更快。

于 2012-11-15T22:50:50.650 回答
0

首先:if/switch 语句并不是真正动态的,而数组是因为它们占用内存(是的,我知道 if 语句可能会这样做,但它太小了)。

if 语句不必将变量保存在内存中,因为除了返回值之外,您没有为服务器的 ram(也称为变量)分配任何东西。

相对

该数组中的每个项目都将首先存储在内存中,然后可以在键值方法中使用。

这真的太小了,但我已经用完内存很多次了,从试图做各种大事情的数据库创建动态键 => 值数组。我建议你对这种事情使用 switch 语句。

于 2012-11-15T22:51:37.690 回答
0

你是对的。如果语句更快,因为它比较了最有价值情况下的所有变体。当您使用数组时,它需要时间和内存来在每种情况下创建所有变体。但!带有数组的变体更具可读性和可用性,如果数组不大并且他的值是恒定的(不是函数的结果!),最好使用数组方式。

于 2012-11-15T22:53:35.837 回答
0

您也可以使用 switch 代替 if 。Switch 比 if 语句快

switch ($id){
case 1: return "red";
break;
case 2: return "yellow";
break;
case 3: return "green";
...
}
于 2014-10-05T19:51:44.797 回答