Re: Speeding up thumbnail generation (like multi threaded). Thoughts please.
- From: Mark <markg85 gmail com>
- To: "Dr. Michael J. Chudobiak" <mjc avtechpulse com>
- Cc: gtk-devel-list gnome org
- Subject: Re: Speeding up thumbnail generation (like multi threaded). Thoughts please.
- Date: Tue, 29 Sep 2009 21:16:04 +0200
On Tue, Sep 29, 2009 at 6:00 PM, Mark <markg85 gmail com> wrote:
> 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?
>
Here is the benchmarking script:
http://codepad.org/hDNLjx4p
And what you need to do before you compile and run it:
There are various paths in this script like:
/home/mark/ThumbnailingBenchmarks/2000_Wallpapers-Reanimation/ so you
obviously need to change them to your image source path. Note: there
are more paths then this example!
You can run three benchmarks:
// GLib Thumbnailing Benchmark
//GLibThumbnailingBenchmark();
// Glib more rapid thumbnailing benchmark
//GLibThumbnailingBenchmarkRapid();
//Glib threaded thumbnailing (this is the
GLibThumbnailingBenchmarkRapid benchmark only in multiple threads)
GlibThreadedThumbnailingBenchmark();
by default the threaded benchmark is going to run but you can
obviously comment that one and run one of the other 2 benchmarks. The
difference between the GLibThumbnailingBenchmark and
GLibThumbnailingBenchmarkRapid is that the rapid one uses
gdk_pixbuf_new_from_file_at_scale where the non rapid one uses
gdk_pixbuf_new_from_file which takes significantly longer as noted in
the benchmarks.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]