【问题标题】:How much resources does it take to call and read from Session object in ASP.NET?在 ASP.NET 中调用和读取 Session 对象需要多少资源?
【发布时间】:2012-05-14 16:51:07
【问题描述】:

我想知道这样调用 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 对象时应该注意多少?

【问题讨论】:

    标签: asp.net performance optimization


    【解决方案1】:

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

    会话将数据保存/保留在 Dictionary&lt;string,object&gt; 对象中。

    所以当你做了这个

    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 不会有明显的延迟。值得注意的是,会话锁定所有用户,直到页面加载和卸载。

    亲戚:Replacing ASP.Net's session entirely

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-02-22
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多