原型模式 clone 比 new 还慢?
win和linux的php测试
win: php7.4.4
linux: php7.2.29
不得不说,linux
比win
快真多
文档「设计模式全集」- 原型模式
原本在看设计模式 - 原型模式,用phpunit
测试下性能,
clone
怎么比new
还慢,又换成了php
,还是一样的结果。
(内存消耗也是差不多的)
贴代码 复制粘贴即可运行 (展开再复制)
<?php
abstract class BookPrototype
{
/**
* @var string
*/ protected $title;
/**
* @var string
*/ protected $category;
abstract public function __clone();
public function getTitle(): string
{
return $this->title;
}
public function setTitle($title)
{ $this->title = $title;
}
}
class BarBookPrototype extends BookPrototype
{
/**
* @var string
*/ protected $category = 'Bar';
public function __clone()
{ }}
function toMillisecond($curr_time,$old_time)
{
return round($curr_time - $old_time ,2) * 1000 .'ms';
}
$max = 300000;
$str = '';
//new对象
$new_time = microtime(true);
for($i = 0; $i<= $max;$i++){
$pro = new BarBookPrototype();
$pro->setTitle($i);
$pro->getTitle();
}
$str .= '创建对象使用时间:'. toMillisecond(microtime(true),$new_time).PHP_EOL;
//克隆
$clone_time = microtime(true);
$barBookPrototype = new BarBookPrototype();
for($i = 0; $i<= $max;$i++){
$pro = clone $barBookPrototype;
$pro->setTitle($i);
$pro->getTitle();
}
$str .= '克隆对象使用时间:'. toMillisecond(microtime(true),$clone_time).PHP_EOL;
echo $str;
当
原型类
的__constrct()
复杂时clone
会比new
更节省开销因为
clone
并不会执行__construct
以
laravel
的User
模型为例,clone
比new
快很多然后取消
User
模型的__construct
速度几乎一致