1

这段代码在 0.8 秒内执行,占用了我机器上 22Mb 的内存。

   $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);
    }
   }

可以做些什么来加速它,但更重要的是降低它在任何给定时间消耗的内存占用。

4

4 回答 4

3

您的函数总共进行了 100 万次迭代,这总是需要相当多的 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);
}

但是,这些都不会减少内存占用,因为您正在构建的数据结构基本上是一个大数据结构。

也许你从错误的方向看这个问题?您在这里真正应该问自己的第一件事是,您真的需要如此庞大的数据结构来完成您想做的事情吗?循环展开和使用更快的随机数生成器会给你带来一些性能提升,但最终你可以拥有的最快的代码是你不编写的代码。任何给定算法的性能的最大因素始终是算法的选择。如果您重新考虑您想要做什么,您可能会想出一些不浪费计算机内存和处理资源的方法。

于 2011-04-30T16:09:54.297 回答
2

尝试以下代码(来自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 行中调用函数:

$ia[$i][$j] = createcolor($im, mt_rand(0,96), mt_rand(0,128), mt_rand(0,255));

摆弄硬编码值 1000,看看它如何改变内存使用情况。

于 2011-04-30T16:37:17.063 回答
1

据我所知,似乎imagecreatetruecolor可能是最有可能成为内存猪的罪魁祸首。

您可以使用另一种方法(例如imagecreate)来创建图像吗?

于 2011-04-30T16:12:40.727 回答
1

我可以在您的代码中看到的唯一改进是不会多次分配相同的颜色(在您的情况下3.203.328500.000像素颜色),这应该会减少您的内存占用:

$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()则应该减少内存消耗。


我不确定你要归档什么,但也许你会更好mt_rand()

兰德() mt_rand()

于 2011-04-30T18:20:44.357 回答