Для приведенной ниже реализации кэша у меня есть значительная пропускная способность для операций put и remove.
Cache<double , CacheData> lCache = gGrid.GetOrCreateCache<double, CacheData>("myCache");
Когда я использую строку в качестве ключа, пропускная способность резко снижается примерно в 10 раз.
Cache<string , CacheData> lCache = gGrid.GetOrCreateCache<string, CacheData>("myCache");
Пара ключ-значение, которую я заполняю, находится в реализации ниже
double lKey=111111111111111;
CacheData lCacheData;
string lKeyStr;
std::ostringstream strs;
strs << (lKey+=mIncrement);
lKeyStr = strs.str();
cache.Put(lKeyStr,lCacheData);
Структура CacheData.
namespace ignite
{
struct CacheData
{
CacheData() :
data()
{
data.assign(2048, 'a');
}
std::string data;
};
}
Почему происходит снижение пропускной способности для вышеуказанной реализации?
Строка не лучший тип для использования в качестве ключа. Каждый раз, когда вы читаете или обновляете запись, Ignite вычисляет ключевой хэш-код, а затем проверяет равенство. Проверка на равенство для строки подразумевает итерацию по всем символам, что, очевидно, хуже, чем сравнение одного двойного значения, а также ухудшается для более длинных строк.
Вышесказанное действительно верно для любой хэш-карты, а не только для Ignite.
Других решений пока нет …