PHPプログラムでネストループが6つありますが、スクリプトの計算時間が非常に遅いです。私は6つのループを実装し、別の言語に切り替えることを意味していても計算時間を増やすより良い方法があるかどうか尋ねたいと思います。私が実装しているアルゴリズムの性質は反復を必要とするので、どのように実装すれば良いのか分かりません。PHPのネストされたループが極端に遅い
ここにコードがあります。
<?php
$time1 = microtime(true);
$res = 16;
$imageres = 128;
for($x=0;$x<$imageres;++$x){
for($y=0;$y<$imageres;++$y){
$pixels[$x][$y]=1;
}};
$quantizermatrix = 1;
$scalingcoefficient = 1/($res/2);
for($currentimagex=0;$currentimagex<($res*($imageres/$res-1)+1);$currentimagex = $currentimagex +$res){
for($currentimagey=0;$currentimagey<($res*($imageres/$res-1)+1);$currentimagey = $currentimagey +$res){
for($u=0;$u<$res;++$u){
for($v=0;$v<$res;++$v){
for($x=0;$x<$res;++$x){
for($y=0;$y<$res;++$y){
if($u == 0) {$a = 1/(sqrt(2));} else{$a = 1;};
if($v == 0){$b = 1/(sqrt(2));}else{$b = 1;};
$xes[$y] = $pixels[$x+$currentimagex][$y+$currentimagey]*cos((M_PI/$res)*($x+0.5)*$u)*cos(M_PI/$res*($y+0.5)*$v);
}
$xes1[$x] = array_sum($xes);
}
$xes2= array_sum($xes1)*$scalingcoefficient*$a*$b;
$dctarray[$u+$currentimagex][$v+$currentimagey] = round($xes2/$quantizermatrix)*$quantizermatrix;
}}}};
foreach($dctarray as $dct){
foreach($dct as $dc){
echo $dc." ";
}
echo "<br>";}
$time2 = microtime(true);echo 'script execution time: ' . ($time2 - $time1);
?>
このPNG画像におけるすべての画素を通る本質的にコード反復
問題だと計算された行列を出力するコードのセクションであるので、私は、無関係のコードの大部分を削除しました(2次元配列)。このコードは、128x128の画像で約2秒かかります。これは、通常のイメージのため、このプログラムは非実用的にするよりも大きい128×128
をあなたを助けるかもしれない、以下のリンクを参照してください、私は2秒を言うと思います4.4兆回の反復には非常に適しています。多くの機能の1つがあなたのニーズをサポートしているかどうかを見るために、「Imagick」のような図書館を見てみましたか? – Scopey
どのようにその番号を取得しましたか? 128x128の行列で計算されている計算はほとんどありません。 – user4757174
6つの数値を掛けました。あなたはそのような深いサイクルを構築することに間違っています。深さ3で十分です。 –