从长远来看,HttpRuntime.Cache上的ConcurrentDictionary会不会伤害我?

时间:2012-05-10 18:22:21

标签: asp.net-mvc performance

我试图挤出任何可能的perf,因此我正在查看自定义的ViewLocationCache。

默认值将查找存储在HttpRuntime.Cache中,如果可能,我想尽量避免与之相关的开销。主要是因为我有几个在循环中调用Html.RenderPartial的视图。

我想做的是使用ConcurrentDictionary代替。我查看了MVC源代码,我看不出也没想到这会是坏事。我部署到Azure,因此AppDomain可以保证在部署时重置,而且我不需要担心糟糕的命中。

我错过了一些非常明显的事情,为什么不应该这样做?

//fastCache is a static ConcurrentDictionary<string, string>
public string GetViewLocation(HttpContextBase httpContext, string key)
{
    return fastCache[key];
}

public void InsertViewLocation(HttpContextBase httpContext, string key, string virtualPath)
{
    fastCache[key] = virtualPath;
}

1 个答案:

答案 0 :(得分:3)

HttpRuntime.Cache为您提供了可以配置的细粒度过期策略,您无法使用并发字典。例如,如果您的服务器根据您为项目定义的优先级开始内存不足,它将使它们到期,而并发字典将继续增长,直到您的应用程序因内存不足错误而崩溃。但是如果你已经确定HttpRuntime.Cache会以某种方式惩罚你的应用程序性能(这会非常令人惊讶),那么尝试寻找替代方案似乎是正当的理由。只是不要忘记HttpRuntime.Cache比简单的线程安全哈希表要多得多。