Dmitry, Sorry, for the length of my reply, and now the fact that I'm just refferring you to another source. I'm actually not responsible for the gd library (at least since I last checked :). Your help would definitely be appreciated, I've forwarded this request to [EMAIL PROTECTED] which is the developers mailing list. If you would like to work on the gd extension, please feel free to apply for a cvs account at: http://www.php.net/cvs-php.php
Thanks, Sterling > Hello, > > I have recently learned that GD library is being integrated into > PHP, and apparently you have some relation to that. > > While GD library has a very good set of functions, the > implementation is very poor in my opinion. The code is quite > redundant and un-optimized in any way. This probably has to be > addressed to the author of GD, but since it is now going to be > part of PHP, may be some apparent optimization can be applied to > the bundled version. > > My concerns raised when I tried to use ImageCopyResampled > function. It nearly brings my server to its knees due to high > memory and processor usage (when running 15-20 Apache processes > each processing some image via ImageCopyResampled in PHP). The > processing time is also very high - typically around 10 seconds > for 1 calls to ImageCopyResampled with 1-2 megapixel images. > > Of course, those numbers relate to my server, people with faster > computers may get better results. > > By in any case, I decided to look into implementation of > gdImageCopyResampled in GD library and saw lots of this that can > be improved. I did not look into other function, but I suspect > this is true for the whole GD library. > > The function uses brute force approach and many values that can > be calculated in the outer loop or outside of any loops are > being calculated in the inner loop. E.g. > > sy1 = ((float) y - (float) dstY) * (float) srcH / (float) dstH; > sy2 = ((float) (y + 1) - (float) dstY) * (float) srcH / (float) dstH; > is being calculated for each x, while it really needs to be calculated for each y. > > This part is a constant: > > (float) dstY * (float) srcH / (float) dstH > > and therefore can be calculated once per call, not dstW*dstH*2 times. > > Similarly, > > int pd = gdImageGetPixel (dst, x, y); > > is being called inside of the inner loop (dstW*dstH times!) = but > is not being used anywhere later! > > Applying some apparent mathematics, we can calculate the final > spixels value in one easy step, rather than using (potentially) > multiple floating point additions and multiplications in the inner loop (spixels > += xportion * yportion). Instead total spixels value for the current (x,y) can be >found as > > spixels = (y2-y1)* (x2-x1); // and, again, this can also be optimized further > > I can point out several other things that can be easily improved, but you got my >point already. > > It is possible to reduce number of calculation dramatically, without breaking >readability and/or > compatibility. > > I am wondering if anyone is considering to do this any time soon. I would be more >than willing > to discuss my suggestions with someone responsible for this library, or even modify >the code > myself (a little bit harder for me, since I have little time to make extensive >tests). > > Regards, > Dmitry > > -- > Dmitry Petrov > phone: (212) 641-3235 > pager: [EMAIL PROTECTED] > > > -- > > *** DISCLAIMER *** > > This message is intended only for the use of the individual > or entity to which it is addressed and may contain information > that is privileged, confidential and exempt from disclosure > under applicable law. If the reader of this message is not > the intended recipient or the employee or agent responsible > for delivering the message to the intended recipient, you are > hereby notified that any dissemination, distribution or copying > of this communication is strictly prohibited. If you have received > this message in error, please notify the sender by reply > transmission and delete the message. > ------------------ > > -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php