对于以下缓存实现,我有相当大的吞吐量和删除操作的吞吐量。
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;
};
}
为什么上述实施的吞吐量会降低?
答案 0 :(得分:1)
String不是用作键的最佳类型。每次读取或更新条目时,Ignite都会计算密钥哈希码,然后检查是否相等。等于检查字符串意味着迭代所有字符,这明显比比较单个双精度值更糟糕,并且对于更长的字符串也会变得更糟。
以上情况实际上适用于任何哈希映射,不仅适用于Ignite。