Hi Mark,

On Feb 14, 2012, at 12:03 AM, ext Mark wrote:
> While using Qt's elidedText function 
> http://developer.qt.nokia.com/doc/qt-4.8/qfontmetricsf.html#elidedText i 
> noticed the function was dog slow. For just 1000 entries (each 250 chars) 
> eliding them to 200px took about 190ms on windows and 100ms on linux. Using 
> that for drawing is noticeable slow. I haven't actually tried that, but i 
> certainly would notice that and in the longer run that is my intention.
> 
> So, i started playing with it in an attempt to get it blazing fast. And i got 
> there. On windows i have a speedup of 39x (same job only takes 5ms) and on 
> Linux i got a speedup of 10x (same job takes 10ms, side effect is that linux 
> while 10x faster is now slower then windows.. odd), Those speedups are nice 
> but it tasted like more so i went on to profilling. I already knew the 
> QFontMetricsF::width was the function dragging everything down and a 
> kcachegrind seems to indicate the same.
> 
> Note for the speedups, i got them mostly by cashing the width of the used 
> character thus avoiding the width function as much as possible.
> 
> This is the path that width() takes till the point of calling the freetype 
> functions:
> QFontEngineFT::stringToCMap
> QFontEngineFT::recalcAdvances
> QFontEngineFT::loadGlyph
> 
> loadGlyph is where i think something odd is going on.
> http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/text/qfontengine_ft.cpp#line812
> 
> Note the last parameter: "fetchMetricsOnly" ... The path it took had 
> fetchMetricsOnly set to true : 
> http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/text/qfontengine_ft.cpp#line1611.
>  That leads me to think that this function is only going to fetch the metrics 
> of the glyph, not render it! The opposite is the case. It's rendering it and 
> that is the part that takes long.
> 
> So, am i right here? Is this function doing to much? Remember, we come from 
> the "width()" function. All we actually need is the width of the glyph, 
> that's it.
> 
> Actually, if you look in that function for the fetchMetricsOnly occurrence 
> you'll see that it's only used in one place and there it doesn't seem to do a 
> lot with metrics. It kinda looks like the original implementer of this has 
> some idea, but never finished implementing it. Or am i wrong here?

Your guess is mostly correct. This fetchMetricsOnly flag was added a while ago 
(Nov 5, 2008) to suppress a warning message but it's actually useful to avoid 
doing rendering in that case. I think we should change (set->outline_drawing && 
fetchMetricsOnly) to (set->outline_drawing || fetchMetricsOnly) if not 
regression is caused. How is that working for you?

- Jiang
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to