Remove width cache for Qt 4 frontend. 

Total time for loading UserGuide + 250 x page down is

   4.42s  with map based font cache 
   3.46s  with vector based font cache
   3.44s  without fontcache
   3.18s  without fontcache and inlined QLFontInfo::metrics

Patch for the latter attached.

Note also that ucs4_to_qstring is currently more expensive than
rowBreakPoint() [which was actually the place I intended to work
on...]:


Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
  7.08      0.23     0.23  1855291     0.00     0.00 
font_metrics::width(wchar_t const*, unsigned int, LyXFont const&)
  6.29      0.43     0.20   166256     0.00     0.00 LyXText::getFont(Paragraph 
const&, int) const
  5.97      0.62     0.19  1896072     0.00     0.00 ucs4_to_qstring(wchar_t 
const*, unsigned int)
  5.66      0.80     0.18      259     0.00     0.00 Buffer::buildMacros()
  3.14      0.90     0.10    13891     0.00     0.00 
LyXText::rowBreakPoint(int, Row&) const
  2.20      0.97     0.07    13891     0.00     0.00 LyXText::setRowWidth(int, 
Row&) const
  2.04      1.03     0.07   329379     0.00     0.00  LyXFont::LyXFont()
  1.89      1.09     0.06   397568     0.00     0.00 BufferParams::getFont() 
const
  1.26      1.13     0.04  1709232     0.00     0.00 DocIterator::inTexted() 
const
  1.26      1.17     0.04  1236188     0.00     0.00 DocIterator::inMathed() 
const
  1.26      1.21     0.04   439712     0.00     0.00 
operator==(LyXFont::FontBits const&, LyXFont::FontBits const&)
  1.26      1.25     0.04   308704     0.00     0.00 boost::crc_optimal<32u, 
79764919u, 4294967295u, 4294967295u, true, true>::process_block(void const*, 
void const*
)
  1.26      1.29     0.04    54284     0.00     0.00  (anonymous 
namespace)::RowPainter::paintChars(int&, LyXFont, bool, bool)
  1.26      1.33     0.04    48183     0.00     0.00 LyXText::leftMargin(int, 
int) const
  1.26      1.37     0.04    21317     0.00     0.00 LyXLex::Pimpl::next(bool)
  1.26      1.41     0.04    10913     0.00     0.00 lyx::from_ascii(char 
const*)
  1.10      1.45     0.04  2895302     0.00     0.00 InsetBase::inMathed() const
  1.10      1.48     0.04  1770316     0.00     0.00 
LyXText::singleWidth(Paragraph const&, int, wchar_t, LyXFont const&)
const
  0.94      1.51     0.03   183313     0.00     0.00 Paragraph::setFont(int, 
LyXFont const&)
  0.94      1.54     0.03    64710     0.00     0.00 
LyXText::getLabelFont(Paragraph const&) const
  0.94      1.57     0.03    61943     0.00     0.00  char* 
std::basic_string<char, std::char_traits<char>, std::allocator<char> 
>::_S_construct<__gnu_cxx::__normal_i

I will apply the patch tomorrow evening unless I get objections or
somebody else is faster.

Andre'

Index: FontLoader.C
===================================================================
--- FontLoader.C        (revision 15203)
+++ FontLoader.C        (working copy)
@@ -44,9 +44,6 @@
 using std::string;
 
 
-FontLoader::~FontLoader() {
-}
-
 namespace {
 
 struct symbol_font {
@@ -219,7 +216,6 @@
 QLFontInfo::QLFontInfo(LyXFont const & f)
        : metrics(font)
 {
-
        string const pat = symbolFamily(f.family());
        if (!pat.empty()) {
                bool tmp;
@@ -287,24 +283,6 @@
 }
 
 
-int QLFontInfo::width(Uchar val)
-{
-// Starting with version 3.1.0, Qt/X11 does its own caching of
-// character width, so it is not necessary to provide ours.
-#if defined (USE_LYX_FONTCACHE)
-       QLFontInfo::WidthCache::const_iterator cit = widthcache.find(val);
-       if (cit != widthcache.end())
-               return cit->second;
-
-       int const w = metrics.width(QChar(val));
-       widthcache[val] = w;
-       return w;
-#else
-       return metrics.width(QChar(val));
-#endif
-}
-
-
 bool FontLoader::available(LyXFont const & f)
 {
        if (!lyx_gui::use_gui)
Index: FontLoader.h
===================================================================
--- FontLoader.h        (revision 15203)
+++ FontLoader.h        (working copy)
@@ -18,14 +18,6 @@
 #include <QFont>
 #include <QFontMetrics>
 
-//#if QT_VERSION < 0x030100
-#define USE_LYX_FONTCACHE
-//#endif
-
-#if defined(USE_LYX_FONTCACHE)
-#include <map>
-#endif
-
 /**
  * Qt font loader for LyX. Matches LyXFonts against
  * actual QFont instances, and also caches metrics.
@@ -35,18 +27,12 @@
        QLFontInfo(LyXFont const & f);
 
        /// Return pixel width for the given unicode char
-       int width(Uchar val);
+       int width(Uchar val) const { return metrics.width(QChar(val)); }
 
        /// The font instance
        QFont font;
        /// Metrics on the font
        QFontMetrics metrics;
-
-#if defined(USE_LYX_FONTCACHE)
-       typedef std::map<Uchar, int> WidthCache;
-       /// Cache of char widths
-       WidthCache widthcache;
-#endif
 };
 
 
@@ -55,9 +41,6 @@
 public:
        ///
        FontLoader();
-       
-       /// Destructor
-       ~FontLoader();
 
        /// Update fonts after zoom, dpi, font names, or norm change
        void update();

Reply via email to