Andre Poenitz wrote:
On Sun, Jul 22, 2007 at 01:44:35PM +0200, [EMAIL PROTECTED] wrote:
Selon [EMAIL PROTECTED]:
Selon Guillaume Pothier <[EMAIL PROTECTED]>:
Make sure the profiler runs a little bit longer. 20 seconds cumulative
or so. With 4.74 seconds there's a lot of statistical noise.
Done, now 23s.
I updated the file at the same URL:
http://www.dcc.uchile.cl/~gpothier/gprof.out
One question: are you sure that your Qt is compiled with optimisation and debug
disabled? I've read somewhere that it makes a big difference (similar to the
stdlib_debug one). Looks like the QHash searching takes a lot... Same question
for your boost installation.
Looks like we can shave off 3.5% as
[27] 9.2 0.55 1.61 44157897
lyx::frontend::GuiFontMetrics::width(wchar_t) const [27]
1.61 0.00 88316089/89786389 QHash<wchar_t,
int>::findNode(wchar_t const&, unsigned int*) const [31]
0.00 0.00 16/21 QHash<wchar_t,
int>::detach_helper() [1984]
looks into the hash twice. The code is
int GuiFontMetrics::width(char_type c) const
{
if (smallcaps_shape_)
return smallcapsWidth(c);
if (!width_cache_.contains(c)) {
if (is_utf16(c))
width_cache_.insert(c,
metrics_.width(ucs4_to_qchar(c)));
else
width_cache_.insert(c,
metrics_.width(toqstr(docstring(1,c))));
}
return width_cache_.value(c);
}
Something like
int GuiFontMetrics::width(char_type c) const
{
if (smallcaps_shape_)
return smallcapsWidth(c);
int w = width_cache_.value(c, WHATEVER);
if (w != WHATEVER)
return w;
if (is_utf16(c))
w = metrics_.width(ucs4_to_qchar(c);
else
w = metrics_.width(toqstr(docstring(1, c)); // ***
width_cache_.insert(c, w);
return w;
}
should do.
I've done that change, thanks.
And, of course, the line marked *** does not look overly efficient as
well.
I know but it happens only for the very rare case when one need a utf32
char, and it happens only once of course.
Abdel.