C# 从会话读取或第二次计算值是否更快

C# 从会话读取或第二次计算值是否更快,c#,asp.net,session,session-variables,C#,Asp.net,Session,Session Variables,我还在用ASP和C做我的第一个项目。一切正常。唯一的问题是,我的页面有点慢。所以我开始优化页面的性能 在改进了一些东西(连接池、SQL语句等)之后,出现了一个跨时间计算。我希望它返回实际的日历周: CultureInfo myCI = new CultureInfo("en-US"); System.Globalization.Calendar myCal = myCI.Calendar; CalendarWeekRule

我还在用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());

还是在每一页上计算新的会更快?

我想,使用
会话将不会提高性能

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

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

    根据,
    CultureInfo.GetCultureInfo

    使用指定的区域性名称检索区域性的缓存只读实例

  • 存储其他变量,而不是每次重新创建它们:

    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
    对象并创建一个新的
    日历

    而不是
    CultureInfo myCI=新的CultureInfo(“en-US”)使用
    CultureInfo myCI=CultureInfo.GetCultureInfo(“en-US”):)我怀疑时间上的差异不会很大,在其他区域搜索是否有大的延迟,页面本身,加载的脚本,加载的图像,页面的结构。。媒体上的缓存。。。最后,您需要创建时间来读取和比较两者的实际时间。无论如何,将值存储到会话和从会话读取是一个好的设计,因为您不太可能在每次页面加载时重新计算该值。这不是应用程序中的瓶颈。不要去更改随机的代码位。你需要基准测试,然后改进那些被证明很慢的部件。如果有任何问题的话,可能会出现性能下降,尽管可以忽略不计。为什么?简单地说,从会话状态检索项将导致向状态服务器(Windows服务或SQL server db或任何其他服务器)发出请求。也就是说,有一些资源访问。至于计算,这应该相当快。我建议不要使用会话。现在不是1999年anymore@user3036342你会怎么做?我真的不能说,因为我不知道你会受到什么样的表现打击,但是到目前为止,叶尔达尔·库曼加利耶夫有一个很好的建议。会话的问题是它们在内存中。对代码甚至目录的任何更改都将使其刷新应用程序池,然后应用程序池必须重新初始化所有会话,这可能会丢失工作。它还对服务器资源产生影响。不安的方法会奏效。但你的问题有点暗示性,我认为这是最好的答案。因为我们看不到您的性能在哪里放缓,所以无法提出更好的方法
    
    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);
        }
    }