我有一个通用词典,正在将其用作线程.NET项目(C#)中的缓存。我将在字典上进行大量读取(在高峰时间每秒可能读取数百次或更多)。
我有一个简单的Get(int id)方法,如果它在缓存中,则应该返回一个CustomObject,否则返回null。
我的问题:
锁定字典是更快/更有效的方法,还是仅使用try/catch块?
假设字典存储在名为“dic”的变量中。
锁定样本:
public CustomObject Get(int id)
{
lock(dic)
{
if (dic.ContainsKey(id))
return dic[id];
}
return null;
}
尝试/捕获样本:
public CustomObject Get(int id)
{
try
{
return dic[id];
}
catch
{
return null;
}
}
最佳答案
我认为您应该在自己的环境中对其进行测试。基本上:
因此,现在的问题是,您期望多久发生一次高速缓存未命中,并因此引发异常。我会选择lock(),因为它的执行时间不取决于您是否会遇到缓存命中,这意味着它更可预测和可测量,同时仍然非常便宜。我认为每秒数百次点击不会有任何问题。
我所做的简单测试表明,使用try/catch获取缓存缺失非常非常昂贵。
编辑:
简单测试表明:
这意味着使用lock(),因为如果您在数千次尝试中获得1次以上的高速缓存未命中,则它比try/catch效率更高,并且更加稳定,不受运气的影响。
关于.net - 在线程(.NET)中锁定或 try catch 字典是否更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6934943/