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)
This commit is contained in:
@@ -125,6 +125,7 @@ public:
|
|||||||
int totalCards();
|
int totalCards();
|
||||||
int randomCardId();
|
int randomCardId();
|
||||||
private:
|
private:
|
||||||
|
map<string, MTGCard *> mtgCardByNameCache;
|
||||||
int processConfLine(string &s, MTGCard* card, CardPrimitive * primitive);
|
int processConfLine(string &s, MTGCard* card, CardPrimitive * primitive);
|
||||||
bool addCardToCollection(MTGCard * card, int setId);
|
bool addCardToCollection(MTGCard * card, int setId);
|
||||||
CardPrimitive * addPrimitive(CardPrimitive * primitive, MTGCard * card = NULL);
|
CardPrimitive * addPrimitive(CardPrimitive * primitive, MTGCard * card = NULL);
|
||||||
|
|||||||
@@ -632,10 +632,18 @@ MTGCard * MTGAllCards::getCardByName(string name)
|
|||||||
if (!name.size()) return NULL;
|
if (!name.size()) return NULL;
|
||||||
if (name[0] == '#') return NULL;
|
if (name[0] == '#') return NULL;
|
||||||
|
|
||||||
|
map<string, MTGCard * >::iterator cached = mtgCardByNameCache.find(name);
|
||||||
|
if (cached!= mtgCardByNameCache.end())
|
||||||
|
{
|
||||||
|
return cached->second;
|
||||||
|
}
|
||||||
|
|
||||||
int cardnb = atoi(name.c_str());
|
int cardnb = atoi(name.c_str());
|
||||||
if (cardnb)
|
if (cardnb)
|
||||||
{
|
{
|
||||||
return getCardById(cardnb);
|
MTGCard * result = getCardById(cardnb);
|
||||||
|
mtgCardByNameCache[name] = result;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
|
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;
|
if (setId != -1 && setId != c->setId) continue;
|
||||||
string cardName = c->data->name;
|
string cardName = c->data->name;
|
||||||
std::transform(cardName.begin(), cardName.end(), cardName.begin(), ::tolower);
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user