通过缓存,ThreadStatic等降低ASP.NET中的初始化频率
我想在多个并发ASP.NET请求中使用一组非线程安全的编码器实例,而不重新初始化它们.如果我不关心初始化成本,我会这样做:
public class ResultController { public JsonResult GetResults() { List<MyViewModel> items = new List<MyViewModel>(); // It obviously does more than this in real life for(id = 0; id < 1000; id++) { items.Add(new MyViewModel(id)); } return Json(items); } } public class MyViewModel() { public string CodedId { get; set; } public MyViewModel(int id) { // This "new" is the concern CodedId = new ExpensiveToInitializeCodec().InexpensiveEncode(id); } } 工作良好.所有本地人,不担心线程,并且我的模型之外没有人需要理解值是以编码方式呈现的.但是,快速性能测试表明,每次初始化大约需要0.129ms,而编码本身需要的时间少于.006ms. (仅供参考,编解码器是TripleDESCryptoServiceProvider). 我想限制初始化成本而不传递预先初始化的对象(例如进入构造函数以提高性能,但打破关注点的分离).这是我目前所做的,在这个简单的例子之外,它显然变得混乱: public class ResultController { public JsonResult GetResults() { List<MyViewModel> items = new List<MyViewModel>(); ExpensiveToInitializeCodec codec = new ExpensiveToInitializeCodec(); for(id = 0; id < 1000; id++) { items.Add(new MyViewModel(id,codec)); } return Json(items); } } public class MyViewModel() { public string CodedId { get; set; } public MyViewModel(int id,ExpensiveToInitializeCodec codec) { CodedId = codec.InexpensiveEncode(id); } } 我可以利用众所周知的ASP.NET每请求缓存模式: public class MyViewModel() { public string CodedId { get; set; } public MyViewModel(int id) { CodedId = ExpensiveToInitializeCodec.Get().InexpensiveEncode(id); } } public class ExpensiveToInitializeCodec { public static ExpensiveToInitializeCodec Get() { ExpensiveToInitializeCodec codec = HttpContext.Current.Items["codec"]; if (codec == null) { codec = new ExpensiveToInitializeCodec(); HttpContext.Current.Items["codec"] = codec; } return codec; } } 但是,在紧密的循环中运行仍然是浪费:How much computation is behind a HttpContext.Current call? 似乎每线程解决方案可能比每个请求解决方案更精确.任何与ASP.NET请求兼容的建议? 在ASP之外,但仍然在.NET领域,一个人的答案是ThreadStatic:Using ThreadStatic to replace expensive locals — good idea?.但是,http://blog.idm.fr/2010/03/aspnet-thread-agility-or-why-threadstatic-should-not-be-used.html显然排除了ASP.NET中的解决方案.与我的Is there any way to imitate ThreadStatic for use with HttpContext.Current.Items?类似的问题没有得到答复. 编辑:如果我确保我的编解码器使用不与I / O操作交错,看起来我可以使用ThreadStatic,但我不确定它是多么安全. 我现在已经到了,但我想到的一些其他方法包括1)为具有EncodedAttribute的项目提供自定义序列化/反序列化,2)实现我自己的静态TripleDES单块加密器,没有实例初始化开销,3)反对我的首选项,将外部初始化的加密器传递给每个项目的构造函数,4)实现IEncryptable接口并在填充结果后重新枚举项目,5)执行viewmodel外部的所有加密,在使用viewmodel的任何地方实现. 解决方法
访问HttpContext.Current.Items的性能成本真的是一个问题,或者你只是在猜测?根据您提供的数字和您提出的问题中的数字,然后在链接的问题中的数字不应该是:
? – 对于1000次迭代,单次初始化为6ms,持续时间为129 ms ? – HttpContext在10K迭代中占用0.1ms(在你的情况下为0.01) 线程静态是一个坏主意.虽然它可能会工作,但您将来无法使用异步控制器和类似功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 发布网站时,我的默认文档名称不断从IIS中删除
- asp.net – 更改User-Agent标头触发表单身份验证
- asp.net-mvc – 如何将模型中的占位符文本添加到MVC视图中?
- asp.net-mvc – ASP.NET MVC和IIS 5
- 本地iis上的asp.net核心Windows身份验证
- asp.net-mvc-4 – MVC4不要在重定向上使用主布局
- asp.net – 如何.NET网站隐藏它们的文件的.aspx扩展名?
- asp.net – ASP GridView在编辑模式下的所有行
- asp.net – Telerik RadGrid GridDataItem – 如何确定列是
- 是否可以还原ASP.NET预编译?
- 如何确定使用32位与64位ASP.NET?
- ASP.NET – 从不调用以编程方式创建的按钮的事件
- asp.net-mvc – 未找到MVC 6 404
- asp.net – 文件 – >在MonoDevelop中打开网站?
- asp.net – SQL Server Reporting Services – 运
- asp.net-mvc – Structuremap没有为此对象定义的
- asp.net – 在web.config和asp页面中注册用户控件
- asp.net – AJAX将多个参数传递给WebApi
- asp.net-mvc-2 – ASP.NET MVC 2显示名称DataAnn
- asp.net页面生命周期