[英]Code take too long to process and has a big memory footprint
这段代码在 0.8 秒内执行,在我的机器上占用了 22Mb 的 memory。
$x=500;
$y=500;
$im = imagecreatetruecolor($x,$y);
$ia=array();
for ($i = 0; $i < $x; $i++) {
for ($j = 0; $j < $y; $j++) {
$r=rand(0,96);
$g=rand(0,128);
$b=rand(0,255);
$ia[$i][$j]=ImageColorAllocate($im,$r,$g,$b);
}
}
可以做些什么来加快它,但更重要的是降低它在任何给定时间吃掉的 memory 足迹。
您的 function 总共进行了 25 万次迭代,这总是需要相当多的 PHP 脚本要做。
但是,您可以做一些事情。
首先,mt_rand() 比 rand() 快,请改用它。
其次,如果您在内循环上使用循环展开,您可能会获得一些速度提升。 我不确定它在 PHP 中的实际效果如何,但您可以对其进行基准测试以查看它的效果。
for ($j=0;$j<$y;$j+=10) {
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 1]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 2]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 3]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 4]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 5]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 6]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 7]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 8]=ImageColorAllocate($im,$r,$g,$b);
$r=mt_rand(0,96);
$g=mt_rand(0,128);
$b=mt_rand(0,255);
$ia[$i][$j + 9]=ImageColorAllocate($im,$r,$g,$b);
}
但是,这些都不会减少 memory 的占用空间,因为您正在构建的数据结构基本上是一个大的。
也许你从错误的方向看这个问题? 您在这里真正应该问自己的第一件事是,您真的需要如此庞大的数据结构来完成您想做的事情吗? 循环展开和使用更快的随机数生成器会给你带来一些性能提升,但最终你可以拥有的最快的代码是你不编写的代码。 任何给定算法的性能的最大因素始终是算法的选择。 如果您重新考虑您想要做什么,您可能会想出一些不浪费计算机 memory 和处理资源的方法。
尝试以下代码(来自http://php.net/manual/en/function.imagecolorallocate.php )而不是直接分配颜色:
function createcolor($pic,$c1,$c2,$c3) {
$color = imagecolorexact($pic, $c1, $c2, $c3);
if($color==-1) {
if(imagecolorstotal($pic)>=1000) {
$color = imagecolorclosest($pic, $c1, $c2, $c3);
} else {
$color = imagecolorallocate($pic, $c1, $c2, $c3);
}
}
return $color;
}
此外,尝试在 1 行中调用 function:
$ia[$i][$j] = createcolor($im, mt_rand(0,96), mt_rand(0,128), mt_rand(0,255));
摆弄硬编码值 1000,看看它如何改变 memory 的使用。
据我所知,似乎imagecreatetruecolor可能是最有可能成为 memory 猪的罪魁祸首。
您可以使用另一种方法(例如imagecreate
)来创建图像吗?
我可以在您的代码中看到的唯一改进不是多次分配相同的颜色(在您的情况下, 3.203.328
colors 为500.000
像素),这应该会减少您的 memory 占用空间:
$x = 500;
$y = 500;
$image = ImageCreateTrueColor($x, $y);
$matrix = array();
$colors = array();
for ($i = 0; $i < $x; $i++)
{
for ($j = 0; $j < $y; $j++)
{
$rand = array(rand(0, 96), rand(0, 128), rand(0, 255));
if (isset($colors[implode('|', $rand)]) !== true)
{
$colors[implode('|', $rand)] = ImageColorAllocate($im, $rand[0], $rand[1], $rand[2]);
}
$ia[$i][$j] = $colors[implode('|', $rand)];
}
}
此外,如果您不需要真彩色图像ImageCreate()
应该更少 memory 猪。
我不确定您要存档的内容,但也许使用mt_rand()
会更好:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.