克隆是写拷贝吗?

时间:2015-09-08 03:55:00

标签: php imagick

当我使用Imagick运算符克隆clone对象时,哪一个是昂贵的操作,clone或后续写入克隆?

$image = new Imagick();
$image->readImage('some_big_image.jpg');

$new_image = clone $image; // is this an expensive operation?

2 个答案:

答案 0 :(得分:1)

是的,Imagick对象上的clone方法确实可以正常工作,而不仅仅是增加内部引用计数器。

特别是它在底层的ImageMagick库中调用CloneMagickWand。这会复制'图像' - 但是ImageMagick并不总是保留内存中图像的所有像素。所以它的确做多少工作并不明显,可能取决于你如何配置ImageMagick。

后续写入的费用取决于所使用的功能。在保存图像之前,为图像设置新格式并不是很多。模糊图像可以(显然)做很多工作。

答案 1 :(得分:1)

在Windows 7上使用ImageMagick 6.8.9构建的Imagick 3.3.0RC2进行的一些测试给出了以下结果:

$image = new Imagick();
$image->setResolution(1000,1000);

// This is a vector image, to make sure it's not just memory-mapped or something like that
$image->readImageBlob(file_get_contents(__DIR__.'/test.eps'));

$new_image = clone $image;                                         // 0.012 s  
$new_image->floodFillPaintImage('black', 0, 'white', 0, 0, false); // 0.179 s
$image->floodFillPaintImage('black', 0, 'white', 0, 0, false);     // 0.126 s

(我在循环中运行,给定的持续时间是平均值。)

从这些数字来看,与后续写作相比,clone似乎非常便宜。