Re: Speeding up thumbnail generation (like multi threaded). Thoughts please.



On Mon, Aug 31, 2009 at 4:06 PM, Dr. Michael J. Chudobiak
<mjc avtechpulse com> wrote:
> On 08/31/2009 09:03 AM, jcupitt gmail com wrote:
>>>>
>>>> a very quick load-at-1/8th-size read where it just decompresses enough
>>>> to be able to get the DC component of each 8x8 block. If you use
>>>> libjpeg like this you can expect around a 100x speedup of the
>>>> decompress step.
>>>
>>> The gdk-pixbuf jpeg loader does this already.
>>
>> That's good, but I wonder if this feature is being used? I tried this
>> tiny program:
>
> I believe this is where it happens:
>
> http://git.gnome.org/cgit/gtk+/tree/gdk-pixbuf/io-jpeg.c#n924
>
>
> - Mike
>

I've done some more testing.
The following test results are still with the same 1927 images.

## Thumbnails generated the nautilus way from:
gnome_desktop_thumbnail_factory_generate_thumbnail() and that function
runs: gnome_desktop_thumbnail_scale_down_pixbuf and not
gdk_pixbuf_scale_simple which is odd to say the least
real	2m43.595s
user	2m42.433s
sys	0m0.950s

Lets say this is our current 100%. for the rest of the benchmarks 100%
is the base.

## With the function: gdk_pixbuf_scale_simple
real	2m19.266s
user	2m17.914s
sys	0m1.077s

Note: 117% faster then gnome_desktop_thumbnail_scale_down_pixbuf


## With the function: gdk_pixbuf_new_from_file_at_scale
real	1m14.422s
user	1m13.605s
sys	0m0.787s

Note: 220% faster then gnome_desktop_thumbnail_scale_down_pixbuf
Note 2: 187% faster then gdk_pixbuf_scale_simple


So, the current way: gnome_desktop_thumbnail_scale_down_pixbuf is the
slowest possible way to go out of the available functions to scale a
image down.
Now i'm wondering why that function
gnome_desktop_thumbnail_scale_down_pixbuf has been made in the forst
place.. the comments above it state:

/**
 * gnome_thumbnail_scale_down_pixbuf:
 * @pixbuf: a #GdkPixbuf
 * @dest_width: the desired new width
 * @dest_height: the desired new height
 *
 * Scales the pixbuf to the desired size. This function
 * is a lot faster than gdk-pixbuf when scaling down by
 * large amounts.
 *
 * Return value: a scaled pixbuf
 *
 * Since: 2.2
 **/

Well, the benchmarks ran above are resizing 1927 wallpaper sized
images to a max width or height of 200 and that function clearly
loses.
The solution to this is extremely simple. Grab this file:
http://git.gnome.org/cgit/gnome-desktop/tree/libgnome-desktop/gnome-desktop-thumbnail.c
and replace the line:
      scaled = gnome_desktop_thumbnail_scale_down_pixbuf (pixbuf,
						  floor (width * scale + 0.5),
						  floor (height * scale + 0.5));
with a function that is (a lot) faster.

Now i already did more benchmarking with the last function
(gdk_pixbuf_new_from_file_at_scale) only then threaded and that adds a
major speed boost! with me the time for thumbnailing 1927 images
dropped to 31 seconds (552% faster then the current nautilus way) !
but more on that in a later post.

So, how do we proceed from this point?


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]