在ASP.NET中调用和读取Session对象需要多少资源?

时间:2012-05-14 16:51:08

标签: asp.net performance optimization

我想知道调用Session对象是多么浪费(例如):

string test = string.Empty;
for (int i = 0; i < 1000; i++)
{
   test += Session["test"].ToString() + ",";
}

而不是像这样:

string test = string.Empty;
string test_session_value = Session["test"].ToString();
for (int i = 0; i < 1000; i++)
{
   test += test_session_value + ",";
}

(即调用HttpSessionState个对象并从中多次读取会话而不是尽可能少的次数)

是否有任何性能损失(明显)?开发人员在HttpSessionState对象使用时应该注意多少?

2 个答案:

答案 0 :(得分:3)

会话在页面加载时完全是读者,并在页面卸载时保存。因此序列化和非序列化每页只发生一次!

会话保存/将数据保存在Dictionary<string,object>对象中。

所以当你做到这个时

string test = string.Empty;
for (int i = 0; i < 1000; i++)
{
   test += Session["test"].ToString() + ",";
}
实际上,当你在列表中找到一个项目时,Session实际上会调用字典,因为它是使用索引。

现在我在这段代码中要注意的是你使用字符串是一个错误,这是真正昂贵的行。要快速实现,您必须使用StringBuilder,但请说这不是真正的代码,而只是您展示它的方式。

StringBuilder test = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
   test.Append(Session["test"].ToString());
   test.Append(',');
}
  

是否有性能损失?

在现实生活中,我不认为你每页调用1000次会话变量,因此Session不会有明显的延迟。值得注意的是,会话锁定所有用户,直到页面加载和卸载。

亲戚:Replacing ASP.Net's session entirely

答案 1 :(得分:1)

如果会话状态存储在IIS中,那么它将使IIS变得笨重。

如果会话状态存储在Sql server中,那么在不同的应用程序域之间传输数据将是非常昂贵的。

优点: 1.您可以跨机器访问相同的会话状态 2.重新加载app_pool后,可以使用相同的会话状态。

缺点: 1.比过程模式慢。
2.会话状态中的所有对象都必须是可序列化的 3.由于会话变量可以动态创建,无论何时使用,并且不需要开发人员明确地处理它们,因此过度使用会话变量会导致代码非常难以理解和不可维护。