我想知道哪些代码有效。请注意,$type = 1
在整个循环期间是相同的。
if(!$handle = opendir('.')) {
return false;
}
$result = array();
while(false !== ($entry = readdir($handle))) {
if(!$resDir = self::getUrlByType($type, $entry)){
continue;
}
switch($type) {
case 1:
/* do something */
break;
case 2:
/* do something different */
break;
}
}
closedir($handle);
我认为,这两个代码应该以相同的持续时间进行,因为那里只有一个条件。
if(!$handle = opendir('.')) {
return false;
}
switch($type) {
case 1:
$result = array();
while(false !== ($entry = readdir($handle))) {
if(!$resDir = self::getUrlByType($type, $entry)){
continue;
}
/* do something */
}
break;
case 2:
$result = array();
while(false !== ($entry = readdir($handle))) {
if(!$resDir = self::getUrlByType($type, $entry)){
continue;
}
/* do something different */
}
break;
}
closedir($handle);
我在每个脚本$time = -microtime(true);
的开头创建了负片段,并且在脚本结尾处显示了当前微时间$time += microtime(true);
之间的差异。在我显示结果echo "Time: ", sprintf('%f', $time), "\n";
后,我看到了这些值:
第一个脚本的时间是0.0084
和0.0203
之间的平均值。
secon结果差异很大,平均值在0.0062
和0.0072
之间。
我的问题是,这种行为是什么情况?为什么PHP编译器没有兑现?
这是PHP输出:
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Time: 0.000103
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Type: 1
Time: 0.000065
答案 0 :(得分:2)
在我看来,开关内的循环是首选。可能存在一种情况,它可能以某种方式更有意义,因此这取决于方案。
但是从后勤角度来看,在交换机内部设置一个循环意味着你只需要检查一个条件并循环通过很多"已知的"处理。如果你循环一个开关,它会不断地检查一个状态,然后执行一个已知代码的过程只是为了重复自己而更多地听到。