Skip to content
  • Chris Wilson's avatar
    Reduce number of allocations during FcSortWalk(). · 311da231
    Chris Wilson authored and Behdad Esfahbod's avatar Behdad Esfahbod committed
    The current behaviour of FcSortWalk() is to create a new FcCharSet on
    each iteration that is the union of the previous iteration with the next
    FcCharSet in the font set. This causes the existing FcCharSet to be
    reproduced in its entirety and then allocates fresh leaves for the new
    FcCharSet. In essence the number of allocations is quadratic wrt the
    number of fonts required.
    
    By introducing a new method for merging a new FcCharSet with an existing
    one we can change the behaviour to be effectively linear with the number
    of fonts - allocating no more leaves than necessary to cover all the
    fonts in the set.
    
    For example, profiling 'gedit UTF-8-demo.txt'
        Allocator		    nAllocs	    nBytes
    Before:
        FcCharSetFindLeafCreate 62886	    2012352
        FcCharSetPutLeaf        9361	    11441108
    After:
        FcCharSetFindLeafCreate 1940	    62080
        FcCharSetPutLeaf        281		    190336
    
    The savings are even more significant for applications like firefox-3.0b5
    which need to switch between large number of fonts.
    Before:
        FcCharSetFindLeafCreate 4461192	    142758144
        FcCharSetPutLeaf	    1124536	    451574172
    After:
        FcCharSetFindLeafCreate 80359	    2571488
        FcCharSetPutLeaf	    18940	    9720522
    
    Out of interest, the next most frequent allocations are
        FcPatternObjectAddWithBinding 526029    10520580
        tt_face_load_eblc	    42103	    2529892
    311da231