【问题标题】:Is it faster to read from Session or calculated a Value a second time从 Session 读取或第二次计算 Value 是否更快
【发布时间】:2015-11-17 19:55:55
【问题描述】:

我仍在使用 ASP 和 C# 开发我的第一个项目。一切正常。唯一的问题是,我的页面有点慢。于是我开始优化我的页面的性能。

在改进了一些东西(连接池,SQL 语句,...)之后,一个交叉的时间计算出现了。我希望它返回实际的日历周:

            CultureInfo myCI = new CultureInfo("en-US");
            System.Globalization.Calendar myCal = myCI.Calendar;
            CalendarWeekRule myCWR = myCI.DateTimeFormat.CalendarWeekRule;
            DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek;
            currentWeek = myCal.GetWeekOfYear(DateTime.Now, myCWR, myFirstDOW);

现在我想知道我的页面计算一次并将其写入会话是否更快:

            Session["WeekToAnalyze"] = currentWeek;

然后在我下面的所有页面上阅读它:

            currentWeek= Convert.ToInt32(Session["WeekToAnalyze"].ToString());

或者在每个页面上重新计算它是否更快?

【问题讨论】:

  • 而不是CultureInfo myCI = new CultureInfo("en-US"); 使用CultureInfo myCI = CultureInfo.GetCultureInfo("en-US"); :)
  • 我怀疑时间上的差异不会太大,搜索其他区域是否有大延迟,页面本身,您加载的脚本,您加载的图像,页面结构。 . 媒体上的缓存... 最后,您需要创建时间来读取和比较两者的实际时间。
  • 将值存储到会话并从中读取无论如何都是一个不错的设计,因为您不太可能在每次页面加载时重新计算该值。
  • 不是应用程序的瓶颈。不要去更改随机的代码位。您需要进行基准测试,然后改进已被证明运行缓慢的部分。
  • 如果有的话,可能会有性能下降,尽管可以忽略不计。为什么?很简单,从会话状态中检索项目将导致向状态服务器(Windows 服务或 SQL 服务器数据库或任何其他)发出请求。 IE。有一些资源访问。至于计算,应该是相当快的。

标签: c# asp.net session session-variables


【解决方案1】:

我猜,使用Session 不会有任何性能提升。

如果您想提高性能,可以执行以下操作:

  1. 不要使用new CultureInfo(),使用CultureInfo.GetCultureInfo()

    CultureInfo myCI = CultureInfo.GetCultureInfo("en-US");
    

    根据MSDN documentationCultureInfo.GetCultureInfo

    使用指定的文化名称检索文化的缓存的只读实例

  2. 存储其他变量而不是每次都重新创建它们:

    public static class WeekOfYearProvider
    {
        private static CultureInfo CultureInfo { get; }
        private static Calendar Calendar { get; }
    
        static WeekOfYearProvider()
        {
            CultureInfo = CultureInfo.GetCultureInfo("en-US");
            Calendar = _cultureInfo.Calendar;
        }
    
        public static int GetWeekOfYear(DateTime dateTime)
        {
            return Calendar.GetWeekOfYear(dateTime,
                CultureInfo.DateTimeFormat.CalendarWeekRule,
                CultureInfo.DateTimeFormat.FirstDayOfWeek);
        }
    }    
    

每次调用WeekOfYearProvider.GetWeekOfYear,它只会执行一个操作,这很简单,而不是初始化整个CultureInfo对象并创建一个新的Calendar

【讨论】:

  • 我也建议不要使用 Sessions。现在已经不是 1999 年了
  • @user3036342 你会怎么走?
  • 我真的不能说,因为我不知道你正在接受什么样的性能打击,但是 Yeldar Kurmangaliyev 到目前为止有一个很好的建议。会话的问题在于它们在内存中。对代码甚至目录的任何更改都会使其刷新应用程序池,然后必须重新初始化所有会话,这可能会丢失工作。它还对服务器资源产生影响。不安的方法会奏效。但你的问题有点暗示,我认为这是最好的答案。由于我们看不到您的表现在哪里变慢,因此无法真正提出更好的方法
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2020-06-03
  • 2015-12-12
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多