From 751932ddb10d5ce798c56d82bc1f40a443237ac1 Mon Sep 17 00:00:00 2001 From: Patrick Lam Date: Wed, 5 Oct 2005 18:41:55 +0000 Subject: [PATCH] Implement move-to-front array for banks (perf regression reported by Ronny V. Vindenes). --- ChangeLog | 6 ++++++ src/fccache.c | 29 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index b7cfb91..3bbf227 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-10-05 Patrick Lam + * src/fccache.c (FcCacheHaveBank): + + Implement move-to-front array for banks (perf regression + reported by Ronny V. Vindenes). + 2005-10-04 Patrick Lam * src/fccache.c (FcDirCacheValid, FcDirCacheUnlink, FcDirCacheHasCurrentArch): diff --git a/src/fccache.c b/src/fccache.c index 43e45af..0e8c476 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -949,7 +949,7 @@ FcCacheMachineSignature () } static int banks_ptr = 0, banks_alloc = 0; -static int * bankId = 0; +static int * bankId = 0, * bankIdx = 0; static FcBool FcCacheHaveBank (int bank) @@ -969,28 +969,37 @@ FcCacheHaveBank (int bank) int FcCacheBankToIndex (int bank) { - static int lastBank = FC_BANK_DYNAMIC, lastIndex = -1; - int i; - int * b; - - if (bank == lastBank) - return lastIndex; + int i, j; for (i = 0; i < banks_ptr; i++) - if (bankId[i] == bank) - return i; + if (bankId[bankIdx[i]] == bank) + { + int t = bankIdx[i]; + + for (j = i; j > 0; j--) + bankIdx[j] = bankIdx[j-1]; + bankIdx[0] = t; + return t; + } if (banks_ptr >= banks_alloc) { + int * b, * bidx; b = realloc (bankId, (banks_alloc + 4) * sizeof(int)); if (!b) return -1; - bankId = b; + + bidx = realloc (bankIdx, (banks_alloc + 4) * sizeof(int)); + if (!bidx) + return -1; + bankIdx = bidx; + banks_alloc += 4; } i = banks_ptr++; bankId[i] = bank; + bankIdx[i] = i; return i; }