我有以下针对php的测试环境:
class Test {
public $counter;
public static $timer = null;
public static $instances = 0;
public function __construct() {
$this->counter++;
if (self::$instances == 0) {
self::$timer = microtime(true);
}
self::$instances++;
if (self::$instances % 1000 === 0) {
echo "Duration of 1000 builds: " . (microtime(true) - self::$timer) . " secs ( " . self::$instances . " )\n";
self::$timer = microtime(true);
}
}
public function __clone() {
$this->__construct();
}
}
$Test = new Test();
$array = array();
for ($i=0; $i<5000; $i++) {
$array[$i] = clone $Test;
for ($z=0; $z<1000; $z++) {
//$counter = max(0, $i-$z);
$counter = $i-$z;
if ($counter < 0) $counter = 0;
$get = $array[$counter]->counter;
}
}
如果按原样运行此脚本,则会得到以下输出:
1000个构建的持续时间:0.12318682670593秒(1000)
1000次构建的持续时间:0.12733101844788秒(2000)
1000次构建的持续时间:0.12077212333679秒(3000)
1000次构建的持续时间:0.12160491943359秒(4000)
1000次构建的持续时间:0.12030696868896秒(5000)
但是,如果我从$counter = max(0, $i-$z);
行中删除注释,而是注释掉接下来的两行(同样应该执行相同的操作),则会得到以下结果:
1000个构建的持续时间:0.3405590057373秒(1000)
1000次构建的持续时间:0.33710408210754秒(2000)
1000次构建的持续时间:0.3317539691925秒(3000)
1000次构建的持续时间:0.34044504165649秒(4000)
1000次构建的持续时间:0.33882308006287秒(5000)
使用内置的php max
函数大约需要3倍的时间,然后手动计算最大值。奇怪的是,如果我将其转移到一个更基本的示例中,而无需进行类克隆和类构建,则时间是相等的。
谁能解释为什么内置php max
的功能这么慢?