我想知道调用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
对象使用时应该注意多少?
答案 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不会有明显的延迟。值得注意的是,会话锁定所有用户,直到页面加载和卸载。
答案 1 :(得分:1)
如果会话状态存储在IIS中,那么它将使IIS变得笨重。
如果会话状态存储在Sql server中,那么在不同的应用程序域之间传输数据将是非常昂贵的。
优点: 1.您可以跨机器访问相同的会话状态 2.重新加载app_pool后,可以使用相同的会话状态。
缺点:
1.比过程模式慢。
2.会话状态中的所有对象都必须是可序列化的
3.由于会话变量可以动态创建,无论何时使用,并且不需要开发人员明确地处理它们,因此过度使用会话变量会导致代码非常难以理解和不可维护。