2

我想知道像这样调用 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开发人员在使用对象时应该注意多少?

4

2 回答 2

3

页面加载时会话是完全阅读器,并在页面卸载时保存。所以序列化和反序列化每页只发生一次!

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

所以当你做了这个

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

实际上,当您在他的列表中找到一个项目时,会话调用的字典速度非常快,因为它使用了索引。

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

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

是否有任何性能损失?

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

相对:完全替换 ASP.Net 的会话

于 2012-05-14T17:15:02.210 回答
1

如果会话状态存储在 IIS 中,那么它将创建庞大的 IIS。

如果会话状态存储在 Sql server 中,那么不同应用程序域之间的数据传输将耗费时间。

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

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

于 2012-05-14T16:58:05.117 回答