i need the optimized code

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
ganesh_ambhore
Forum Newbie
Posts: 1
Joined: Tue Oct 26, 2004 10:27 am

i need the optimized code

Post by ganesh_ambhore »

patrikG | Help us, help you. Please use

Code: Select all

and

Code: Select all

tags where approriate when posting code. Read:  [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url][/color]

hi all,
        i am a php programmer, i have some problem with this code, i have to optimize this code since it is taking 100% cpu usage by the query written by me. So please suggest me any solution to reduce the cpu utilization.

thanks

Code: Select all

$sql="SELECT r1.tlid, r1.fename, fedirp, fedirs, frlong, frlat, tolong, tolat, cfcc, fetype, blockl, blockr, rtsq, long1, lat1, long2, lat2, long3, lat3, long4, lat4, long5, lat5, long6, lat6, long7, lat7, long8, lat8, long9, lat9, long10, lat10 FROM rt1 r1 left join rt2 r2 on r1.tlid = r2.tlid WHERE cfcc='a41' AND (r1.FETYPE='Rd' OR r1.FETYPE='Ave') AND frlat BETWEEN ( $latc - 0.071328571 ) AND ( $latc + 0.071328571 ) AND frlong BETWEEN ( $longc - 0.071328571 ) AND ( $longc + 0.071328571)";

//$sql="SELECT r1.tlid, r1.fename, fedirp, fedirs, frlong, frlat, tolong, tolat, cfcc, fetype, blockl, blockr, rtsq, long1, lat1, long2, lat2, long3, lat3, long4, lat4, long5, lat5, long6, lat6, long7, lat7, long8, lat8, long9, lat9, long10, lat10 FROM rt1 r1 left join rt2 r2 on r1.tlid = r2.tlid WHERE cfcc in ($cfcc2)  and ((3958.682)*(acos(sin((frlat)*0.01745) * sin(($latc)*0.01745) + cos((frlat)*0.01745) * cos(($latc)*0.01745) * cos((frlong -( $longc))*0.01745))))<=$mile order by fename";

//old query 

$result=$obj1->runsqlreturnrs($sql);

if($CreateLog)
{
	fwrite($logFile,"For Drawing Roads Query\n\r");
	fwrite($logFile,$sql);
	//fwrite($logFile,$sql."\n\r");
}

unset($sql);
$fename1="ss";

$chktlid="";

while($row=mysql_fetch_array($result))
{	
	//Starting points for a chain
	$temparr6[0]	=	$row['frlong'];
	$temparr6[1]	=	$row['frlat'];
	$temparr8	=	cord_trans($temparr6,$latc,$longc,$constant,$var);
	unset($temparr6);
	//Ending points for a chain
	$temparr7[0]	=	$row['tolong'];
	$temparr7[1]	=	$row['tolat'];
	$temparr9	=	cord_trans($temparr7,$latc,$longc,$constant,$var);
	unset($temparr7);
	$fename	=	$row['fename'];
	$fetype	=	$row['fetype'];
	$fedirp	=	$row['fedirp'];
	$fedirs	=	$row['fedirs'];
	$cfcc	=	$row['cfcc'];

	//Check Prefix and suffix for the street names.
	if (($fedirp!="")&&($fedirs==""))
		$Fename	=	$fedirp." ".$fename." ".$fetype;
	elseif (($fedirs!="")&&($fedirp==""))
		$Fename	=	$fename." ".$fetype." ".$fedirs;
	elseif (($fedirp=="")&&($fedirs==""))
		$Fename	=	$fename." ".$fetype;
	else
		$Fename	=	$fedirp." ".$fename." ".$fetype." ".$fedirs;
	
	unset($Fename);

	$Road1	=	$FaintGray2;//$Dark;
	$Road2	=	$Gray2;//$yellow2;

	unset($Gray2,$FaintGray2);

	if (($constant==350)||($constant==260))
		{	$thick	=	4;
			$Road1	=	$bright;
		}

	else
			$thick	=	1	;
	if((strchr(strtolower($cfcc),"a1"))||(strchr(strtolower($cfcc),"a2"))||(strchr(strtolower($cfcc),"a3")))
	{	
		$Road1	=	$Orange;
		$Road2	=	$Orange;
		$thick	=	3;
	}
	else
	{	
		$Road1	=	$bright;
		$Road2	=	$bright;
		$thick	=	2;
	}
	unset($Orange);
		
	if($row['tlid']!=$chktlid)
	{
		$icount=0;
		$temparr_rt2[$icount]=$row['frlong'];
		$icount=$icount+1;
		$temparr_rt2[$icount]=$row['frlat'];
		$icount=$icount+1;
		
		//Loop for fetching 10 longitude,latitude points from table rt2
		for($d=1;$d<=10;$d++)
				{						
					if(($row['long'.$d]!=0)&&($row['lat'.$d]!=0))
					{	
						$temparr_rt2[$icount]=$row['long'.$d];
						$icount	=	$icount+1;
						$temparr_rt2[$icount]=$row['lat'.$d];
						$icount	=	$icount+1;
						
					}
					else
					{	
					//Break the loop if both the longitude and latitude are zero
						break;
					}
				}
		$temparr_rt2[$icount]	=	$row['tolong'];
		$icount	=	$icount+1;
		$temparr_rt2[$icount]	=	$row['tolat'];
		$icount	=	$icount+1;
	
	}
	else
	{	
		$icount=$icount-2;
		for($d=1;$d<=10;$d++)
				{						
					if(($row['long'.$d]!=0)&&($row['lat'.$d]!=0))
					{	
						$temparr_rt2[$icount]=$row['long'.$d];
						$icount	=	$icount+1;
						$temparr_rt2[$icount]=$row['lat'.$d];
						$icount	=	$icount+1;
							
					}
					else
					//Break the loop if both the longitude and latitude are zero
						
						break;
				}
		$temparr_rt2[$icount]	=	$row['tolong'];
		$icount	=	$icount+1;
		$temparr_rt2[$icount]	=	$row['tolat'];
		$icount	=	$icount+1;
		
	}
	$chktlid=$row['tlid'];
	$temparr_rt2_1=cord_trans($temparr_rt2,$latc,$longc,$constant,$var);
	$RoadName1=$fename." ".$fetype;
	unset($RoadName1);
	DrawLines1($temparr_rt2_1,$im2,$icount,$Road1,$Road2,$thick,$constant);
	unset($Road1,$Road2,$thick,$chktlid);
	//Road1-fillcolor Road2- Border color
	//(Condition For printing road names once)

		$intFlg=0;
		/*******************************************************/

		/***********************************************************************/

		if($fetype=="Rd" || $fetype=="Ave")
			 {						
				if(!isset($flg)&&$flg!=true)
				{
					//fwrite($logFile,"Road Name = ".$RoadName."\r");
					$x1			=	$temparr8[0];			//Fromlong in x
					$y1			=	$temparr8[1];			//Fromlat in y
					$x2			=	$temparr9[0];			//Tolong in x
					$y2			=	$temparr9[1];			//Tolat in y

					$arr1		=	GetTheta($x1,$y1,$x2,$y2);  //Function  to Find Angle
					$px				=	$arr1['C1'];
					$py				=	$arr1['C2'];
					$angle			=	$arr1['theta'];
					$RoadName	=	$fedirp." ".$fename." ".$fetype." ".$fedirs;
					$len2				=	strlen($state_name);	
					
					unset($px,$py,$len2);
					//changed 23 sept
					//Storing x,y coordinates and angle for the LAndmarks name
					$NamePts[$b]['x']		= $arr1['C1'];
					$NamePts[$b]['y']		= $arr1['C2'];
					$NamePts[$b]['angle']	= $angle;
					$NamePts[$b]['string']	= $RoadName;
					$NamePts[$b]['color']	= $Road3;
					$b						= $b+1;

					$rdName[$rdCnt++]=trim($RoadName1);	
				}	
				unset($flg,$rdCnt);
			//printing roadname alongwith the roadlines
		unset($RoadName1);
	}
	else
	{	
		$icount=$icount-2;
		for($d=1;$d<=10;$d++)
		{						
			if(($row['long'.$d]!=0)&&($row['lat'.$d]!=0))
			{	
				$temparr_rt2[$icount]	=	$row['long'.$d];
				$icount					=	$icount+1;
				$temparr_rt2[$icount]	=	$row['lat'.$d];
				$icount					=	$icount+1;
						
			}
			else
				//Break the loop if both the longitude and latitude are zero
				break;
		}
		$temparr_rt2[$icount]	=	$row['tolong'];
		$icount					=	$icount+1;
		$temparr_rt2[$icount]	=	$row['tolat'];
		$icount					=	$icount+1;
	}
	//unset($temparr_rt2);
		$chktlid=$row['tlid'];

		unset($arr1,$temparr9,$fedirp,$fedirs);
		$fename1 = $fename." ".$fetype;
		unset($row);
	}

mysql_free_result($result);

unset($rdName);

unset($Road3,$temparr8,$fename);
if($CreateLog)
{
	fwrite($logFile,"For Drawing Roads Query executed\n\r");
	fwrite($logFile,"end: ".date("H:i:s")."\n\r\n");
	//fwrite($logFile,$sql."\n\r");
}
unset($Road3,$temparr8,$fename);
///////////////////////////////////////////////////////////////////////////
//
//Start of the procedure to print  the names 
///////////////////////////////////////////////////////////////////////////
if($CreateLog)
{
	fwrite($logFile,"For For loop executed\n\r");
	fwrite($logFile,"Start: ".date("H:i:s")."\n\r");
	//fwrite($logFile,$sql."\n\r");
}
$NameBoxPts=array();
for($b=0,$maxCount=count($NamePts);$b<$maxCount;$b++) //Loop for String array starts
{
	if ($b==0)//if condition For First name 
		{	
			$NameBoxPts[$b]	=imagettftext($im3,$size,$NamePts[$b]['angle'],$NamePts[$b]['x'],$NamePts[$b]['y'],$NamePts[$b]['color'],$file,$NamePts[$b]['string']);
		}	
	else	
		{		
				$overlap	=	false;
				$box	=	imagettfbbox($size,$NamePts[$b]['angle'],$file,$NamePts[$b]['string']);
				$px0	=	$NamePts[$b]['x']+$box[0]+2;//$points[0];
				$px1	=	$NamePts[$b]['x']+$box[2]+2;//$points[2];
				$px2	=	$NamePts[$b]['x']+$box[4]+2;//$points[4];
				$px3	=	$NamePts[$b]['x']+$box[6]+2;//$points[6];
				$py0	=	$NamePts[$b]['y']+$box[1]+2;//$points[1];
				$py1	=	$NamePts[$b]['y']+$box[3]+2;//$points[3];
				$py2	=	$NamePts[$b]['y']+$box[5]+2;//$points[5];
				$py3	=	$NamePts[$b]['y']+$box[7]+2;//$points[7];

				$minx	=	min($px0,$px1,$px2,$px3);
				$maxx	=	max($px0,$px1,$px2,$px3);//$px1;
				$miny	=	min($py0,$py1,$py2,$py3);//$py3;
				$maxy	=	max($py0,$py1,$py2,$py3);//$py1;
				unset($py0);
				for($q=0,$max=count($NamePts);$q<$max;$q++)
				{
					$minpx	=				min($NameBoxPts[$q][0],$NameBoxPts[$q][2],$NameBoxPts[$q][4],$NameBoxPts[$q][6]); 		//Already Printed Points
					$maxpx	=	max($NameBoxPts[$q][0],$NameBoxPts[$q][2],$NameBoxPts[$q][4],$NameBoxPts[$q][6]); 		
					$minpy	=	min($NameBoxPts[$q][1],$NameBoxPts[$q][3],$NameBoxPts[$q][5],$NameBoxPts[$q][7]); 		
					$maxpy	=	max($NameBoxPts[$q][1],$NameBoxPts[$q][3],$NameBoxPts[$q][5],$NameBoxPts[$q][7]); 		
					$w=$px2-$px0;//$maxx-$minx+10;
					$wp=$NameBoxPts[$q][2]-$NameBoxPts[$q][0];//$maxpx-$minpx;
					$h=$maxy-$miny;//$py3-$py0;
					$hp=$maxpy-$minpy;
					unset($maxpy);
					if(Collision_Test($minx, $miny, $w, $h,$minpx,$minpy,$wp,$hp))
					{
						$overlap	=	true;			
						break;
					}
								
			}						///////End of For Loop
										
			if (!($overlap))
			{	
				if( (strncmp(strtolower(trim($NamePts[$b]['string'])),"i-",2)==0)
					||(strncmp(strtolower(trim($NamePts[$b]['string'])),"united states highway",strlen("united states highway"))==0)
					||(strncmp(strtolower(trim($NamePts[$b]['string'])),"state route",strlen("state route"))==0)					||(strncmp(strtolower(trim($NamePts[$b]['string'])),$state_name,strlen($state_name))==0)
					||(strncmp(strtolower(trim($NamePts[$b]['string'])),"state rt",2)==0)
					||(strncmp(strtolower(trim($NamePts[$b]['string'])),"county road",strlen('county road'))==0)
					||(strncmp(strtolower(trim($NamePts[$b]['string'])),"county route",strlen('county route'))==0)
				)
					PrintRoutNum($NamePts[$b]['string'],$im4,$NamePts[$b]['x'],$NamePts[$b]['y'],$white4,$state_name);
				else
					{					
						$NameBoxPts[$b]=imagettftext($im3,$size,$NamePts[$b]['angle'],$NamePts[$b]['x'],$NamePts[$b]['y'], $NamePts[$b]['color'],$file,$NamePts[$b]['string']);
						//fwrite($logFile,"Road Name = ".$NameBoxPts[$b]."\r");
					}
			}	//End of overlap if
	}			//End of if condition for second names
} //Loop for String array starts
patrikG | Help us, help you. Please use

Code: Select all

and

Code: Select all

tags where approriate when posting code. Read:  [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url][/color]
kettle_drum
DevNet Resident
Posts: 1150
Joined: Sun Jul 20, 2003 9:25 pm
Location: West Yorkshire, England

Post by kettle_drum »

Is that all the fields in the database? If so why not use "SELECT *". If its not that think about normalzing the database.

Then there is things like you put all the results from the database into other variables when you can simply call them from the array in the script.

You could also limit the results.
rehfeld
Forum Regular
Posts: 741
Joined: Mon Oct 18, 2004 8:14 pm

Post by rehfeld »

an easy way to find the problem parts of your script is to use microtime()

Code: Select all

<?php

$time_start1 = microtime(true);

... some code

$time_end1 = microtime(true);
echo 'results of sql query foo'. $time_end1 - $time_start1;



$time_start2 = microtime(true);

... some code

$time_end2 = microtime(true);
echo 'results of image mapping'. $time_end2 - $time_start2;



?>
if your not using php5, use the microtime_float() function
http://php.net/microtime


you can also use ticks, which might be better for your situation

http://php.net/declare



theres also things like apachebench and i think pear has a benchmark utitlity too, they can make things easier and more accurate.
User avatar
Weirdan
Moderator
Posts: 5978
Joined: Mon Nov 03, 2003 6:13 pm
Location: Odessa, Ukraine

Post by Weirdan »

A couple of questions:
  1. where is the bottleneck? is it the problem with your sql/schema or is it with the php code?
  2. what is the average number of rows returned from that query?
  3. what is the total number of rows in both rt1 and rt2 tables?
  4. do indexes exist for fields used in join and where conditions?
  5. post [mysql_man]EXPLAIN[/mysql_man] query here
BTW, was your db denormalized intentionally?

and you might want to look into MySQL spatial extension...
Post Reply