From f6bef262433f6eae4fc08c5637edee22547d5ed9 Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew@gmail.com" Date: Sat, 5 Feb 2011 03:46:41 +0000 Subject: [PATCH] Erwan - added some cache for function getCardByName. On my machine, this divides the running time of the test suite by almost 2 (now runs in 12 minutes instead of 21) --- projects/mtg/include/MTGDeck.h | 1 + projects/mtg/src/MTGDeck.cpp | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index f106c6406..3f443f3d1 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -125,6 +125,7 @@ public: int totalCards(); int randomCardId(); private: + map mtgCardByNameCache; int processConfLine(string &s, MTGCard* card, CardPrimitive * primitive); bool addCardToCollection(MTGCard * card, int setId); CardPrimitive * addPrimitive(CardPrimitive * primitive, MTGCard * card = NULL); diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 95378c145..93bfce84f 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -632,10 +632,18 @@ MTGCard * MTGAllCards::getCardByName(string name) if (!name.size()) return NULL; if (name[0] == '#') return NULL; + map::iterator cached = mtgCardByNameCache.find(name); + if (cached!= mtgCardByNameCache.end()) + { + return cached->second; + } + int cardnb = atoi(name.c_str()); if (cardnb) { - return getCardById(cardnb); + MTGCard * result = getCardById(cardnb); + mtgCardByNameCache[name] = result; + return result; } std::transform(name.begin(), name.end(), name.begin(), ::tolower); @@ -657,9 +665,13 @@ MTGCard * MTGAllCards::getCardByName(string name) if (setId != -1 && setId != c->setId) continue; string cardName = c->data->name; std::transform(cardName.begin(), cardName.end(), cardName.begin(), ::tolower); - if (cardName.compare(name) == 0) return c; + if (cardName.compare(name) == 0) { + mtgCardByNameCache[name] = c; + return c; + } } + mtgCardByNameCache[name] = NULL; return NULL; }