繁体   English   中英

代码处理时间太长,并且 memory 占用空间很大

[英]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()会更好

兰德()mt_rand()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM