[Fontconfig] fontconfig performance problems + FcConfigUptoDate() bug

Lubos Lunak l.lunak at suse.cz
Thu Jul 1 02:52:30 EST 2004


 Hello,

 the fontconfig.org front page says

 Fontconfig can ... efficiently and quickly find the fonts you need among the 
set of fonts you have installed, even if you have installed thousands of 
fonts, while minimzing memory usage.   (Hmm, there's a typo in minimizing 
BTW :) ).

 However, fontconfig on my machine is responsible for a significant portion of 
memory used by my KDE desktop. Have a look at the memory usage table attached 
to http://lists.kde.org/?l=kde-devel&m=108696118031357&w=2 (hint: it's 
readable after you click on the tr3.txt link), left number is bytes 
allocated, right number is number of allocations (i.e. malloc() calls). Font 
are responsible for about 1/5 of memory allocated by a KDE application. For 
whole KDE desktop, this can easily be 10MiB for the plain desktop.

 This is SUSE LINUX 9.1, with:
$ rpm -qa | grep font
 XFree86-fonts-75dpi-4.3.99.902-40
 ghostscript-fonts-std-7.07.1rc1-190
 free-ttf-fonts-1.0-156
 ghostscript-fonts-other-7.07.1rc1-190
 XFree86-fonts-scalable-4.3.99.902-40
$ fc-list | wc -l
 562
$ find /usr/X11R6/lib/X11/fonts/ | wc -l
 3092   (that's not all font files indeed, but most of it is)

 Most of the fonts (~400) and files (~1900) come from the 75dpi package, which 
I think is installed by default.

 
 Let me first start with the FcConfigUptoDate() bug. We (=KDE) are considering 
adding a hack to kdeinit that will reduce the startup time and memory impact 
caused by fontconfig (kdeinit is a process which launches KDE apps by 
fork()-ing and dlopen()-ing the apps). The hack will be calling XftInit() + 
XftInitFtLibrary() before the fork(), so it will do fonts initialization 
including fontconfig in the parent, and because of copy-on-write 
kdeinit-launched apps should have smaller memory usage. A problem with this 
approach is that fontconfig doesn't seem to notice font changes while the app 
is already running - is this a bug or feature? Either way, the hack includes 
a call to FcConfigUptoDate() and possible reinitialization before launching 
apps. For details see 
http://lists.kde.org/?l=kde-optimize&m=108861099022617&w=2 .

 However FcConfigUptoDate() doesn't seem to work. See the attached patch. 
First there's an obvious misplaced parenthesis making it return always false, 
and second, even this call fails to detect font changes (e.g. adding a new 
font to /usr/X11R6/lib/X11/fonts/truetype). The patch should fix that as 
well. The problem seems to be triggered by my fonts.conf specifying 
only /usr/X11R6/lib/X11/fonts , and therefore config->configDirs doesn't 
include subdirs, unlike config->fontDirs.

 But that's only a workaround of course. It'd be nice to have this fixed (or 
at least improved) for real in the lib. I have basically no knowledge about 
fontconfig or even fonts, so I'm not sure what exactly is causing this high 
memory usage, but I assume it's fontconfig creating information about all 
fonts it finds.

 May I suggest this information is simply dumped to one file and read-only 
mmap()-ed into memory, just like KDE's ksysoca? Changing fonts should be a 
rare case, so this should in general make both startup faster and use less 
memory, and if the fonts change, than the cache file can be regenerated and 
mmap()-ed again.

 Thank you

 PS: Attached is also $FC_DEBUG=512 kwrite >/tmp/fc.txt , that might be useful 
as well I suppose.

-- 
Lubos Lunak
KDE developer
---------------------------------------------------------------------
SuSE CR, s.r.o.  e-mail: l.lunak at suse.cz , l.lunak at kde.org
Drahobejlova 27  tel: +420 2 9654 2373
190 00 Praha 9   fax: +420 2 9654 2374
Czech Republic   http://www.suse.cz/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fccfg.c.patch
Type: text/x-diff
Size: 591 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/fontconfig/attachments/20040630/c2fcf013/fccfg.c.bin
-------------- next part --------------
FC_DEBUG=512
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset    2015   26554    2006   25804       9     750
	charleaf       1    4080       0       0       1    4080
	 fontset       1      12       0       0       1      12
	 fontptr       9    5760       8    4608       1    1152
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern     856  129826     285    4560     571  125266
	  patelt     572  109824     571  109568       1     256
	 vallist    5269  127518    4910   98200     359   29318
	substate       0       0       0       0       0       0
	  string    1940   33090    1515   27826     425    5264
	listbuck       0       0       0       0       0       0
	  strset      45    1872       0       0      45    1872
	 strlist       1       8       0       0       1       8
	  config       1      56       0       0       1      56
	 langset     577   16156     571   15988       6     168
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   14015 1048757   12020  872003    1995  176754
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer         5       200
	  Double        12       480
	  String       311     27718
	    Bool         1        40
	  Matrix         0         0
	 CharSet         9       360
	  FTFace         0         0
	 LangSet         5       200
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset    7669  804946    7628  798174      41    6772
	charleaf       5   20400       0       0       5   20400
	 fontset       1      12       0       0       1      12
	 fontptr      15   15360      14   13440       1    1920
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    1369  208456     456    7296     913  201160
	  patelt     913  175232     912  175104       1     128
	 vallist    8490  204864    7887  157740     603   47124
	substate       0       0       0       0       0       0
	  string    2626   45988    2201   40730     425    5258
	listbuck       0       0       0       0       0       0
	  strset      45    1872       0       0      45    1872
	 strlist       1       8       0       0       1       8
	  config       1      56       0       0       1      56
	 langset     941   26348     912   25536      29     812
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   24804 2097543   22164 1803469    2640  294074
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer         6       240
	  Double        20       800
	  String       495     43084
	    Bool         1        40
	  Matrix         0         0
	 CharSet        38      1520
	  FTFace         0         0
	 LangSet        29      1160
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset   11528 1833602   11484 1823772      44    9830
	charleaf       6   24480       0       0       6   24480
	 fontset       1      12       0       0       1      12
	 fontptr      15   15360      14   13440       1    1920
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    1402  213670     467    7472     935  206198
	  patelt     935  179456     934  179328       1     128
	 vallist    8705  209973    8085  161700     620   48273
	substate       0       0       0       0       0       0
	  string    2670   46766    2245   41503     425    5263
	listbuck       0       0       0       0       0       0
	  strset      45    1872       0       0      45    1872
	 strlist       1       8       0       0       1       8
	  config       1      56       0       0       1      56
	 langset     966   27048     934   26152      32     896
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   29003 3146304   26317 2838816    2686  307488
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer         6       240
	  Double        20       800
	  String       506     43993
	    Bool         1        40
	  Matrix         0         0
	 CharSet        41      1640
	  FTFace         0         0
	 LangSet        32      1280
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset   15586 2863474   15537 2849528      49   13946
	charleaf       6   24480       0       0       6   24480
	 fontset       1      12       0       0       1      12
	 fontptr      15   15360      14   13440       1    1920
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    1441  219808     480    7680     961  212128
	  patelt     961  184448     960  184320       1     128
	 vallist    8963  216231    8318  166360     645   49871
	substate       0       0       0       0       0       0
	  string    2722   47725    2297   42466     425    5259
	listbuck       0       0       0       0       0       0
	  strset      45    1872       0       0      45    1872
	 strlist       1       8       0       0       1       8
	  config       1      56       0       0       1      56
	 langset     996   27888     960   26880      36    1008
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   33466 4195363   30720 3876123    2746  319240
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer         6       240
	  Double        20       800
	  String       522     45231
	    Bool         1        40
	  Matrix         0         0
	 CharSet        46      1840
	  FTFace         0         0
	 LangSet        36      1440
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset   20356 3831402   20298 3814180      58   17222
	charleaf       8   32640       0       0       8   32640
	 fontset       1      12       0       0       1      12
	 fontptr      17   19584      16   17408       1    2176
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    1582  242086     527    8432    1055  233654
	  patelt    1055  202496    1054  202368       1     128
	 vallist    9878  238066    9164  183280     714   54786
	substate       0       0       0       0       0       0
	  string    2910   51038    2485   45783     425    5255
	listbuck       0       0       0       0       0       0
	  strset      45    1872       0       0      45    1872
	 strlist       1       8       0       0       1       8
	  config       1      56       0       0       1      56
	 langset    1096   30688    1054   29512      42    1176
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   39678 5243949   36752 4886412    2926  357537
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer         6       240
	  Double        21       840
	  String       575     49506
	    Bool         1        40
	  Matrix         0         0
	 CharSet        55      2200
	  FTFace         0         0
	 LangSet        42      1680
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset   29237 4250620   28863 4212182     374   38438
	charleaf      15   61200       0       0      15   61200
	 fontset       1      12       0       0       1      12
	 fontptr      33   71808      32   67584       1    4224
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    3151  430147    1050   16800    2101  413347
	  patelt    1584  270976    1583  270848       1     128
	 vallist   18048  456718   16020  320400    2028  136318
	substate       0       0       0       0       0       0
	  string    5061   92318    4633   86988     428    5330
	listbuck       0       0       0       0       0       0
	  strset     121    2988      72     720      49    2268
	 strlist      20     160      19     152       1       8
	  config       1      56       0       0       1      56
	 langset    2207   61796    2100   58800     107    2996
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       0       0       1     164
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   62207 6292800   56526 5619923    5681  672877
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer        29      1160
	  Double        21       840
	  String      1485    114858
	    Bool         2        80
	  Matrix         0         0
	 CharSet       371     14840
	  FTFace         0         0
	 LangSet       107      4280
Fc Memory Usage:
	   Which       Alloc           Free           Active
	           count   bytes   count   bytes   count   bytes
	 charset   30349 4528868   29977 4490918     372   37950
	charleaf      15   61200       0       0      15   61200
	 fontset       1      12       0       0       1      12
	 fontptr      33   71808      32   67584       1    4224
	objectse       0       0       0       0       0       0
	objectpt       0       0       0       0       0       0
	  matrix       2      64       1      32       1      32
	 pattern    3165  432288    1055   16880    2110  415408
	  patelt    1592  272512    1592  272512       0       0
	 vallist   18125  458709   16101  322020    2024  136689
	substate       0       0       0       0       0       0
	  string    5096   93488    4672   88222     424    5266
	listbuck       0       0       0       0       0       0
	  strset     125    3036      76     760      49    2276
	 strlist      21     168      21     168       0       0
	  config       1      56       0       0       1      56
	 langset    2217   62076    2110   59080     107    2996
	  atomic       0       0       0       0       0       0
	  blanks       3     396       1     128       2     268
	   cache       1     164       1     164       0       0
	  strbuf     544  557056     544  557056       0       0
	   subst      52     624       0       0      52     624
	objectty       0       0       0       0       0       0
	constant       0       0       0       0       0       0
	    test     104    2496       0       0     104    2496
	    expr     414    4968       0       0     414    4968
	  vstack     486    9720     486    9720       0       0
	    attr     561     561     561     561       0       0
	  pstack     561   17952     561   17952       0       0
	   Total   63468 6578222   57791 5903757    5677  674465
Fc Frozen Values:
	    Type     Count     Bytes
	    Void         0         0
	 Integer        30      1200
	  Double        21       840
	  String      1492    115409
	    Bool         2        80
	  Matrix         0         0
	 CharSet       372     14880
	  FTFace         0         0
	 LangSet       107      4280


More information about the Fontconfig mailing list