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