【问题标题】:Strategies to reduce the number of instantiated objects减少实例化对象数量的策略
【发布时间】:2012-07-25 18:04:09
【问题描述】:

在我们项目的早期,我们创建了一个 Locale 类,其中包含一个字符串,例如“en-US”,我们可以从中派生国家和语言以及其他一些信息。

我们现在面临的问题是我们创建了太多的 Locale 对象。这些对象几乎在任何地方都用作参数或 Dictionary/HashSet 键。在进行了一些分析之后,我们意识到我们花费了太多时间来创建这些 Locale 对象。

知道我们有一组有限的语言环境并且这些对象是不可变的,那么您建议采用什么模式来将创建的对象数量保持在最低限度?

【问题讨论】:

  • 作为给定答案的旁白(这很好),如果适用,请务必考虑线程安全访问。例如,使用Dictionary 缓存条目本质上不是线程安全的(除非您可以保证缓存将在任何读取之前预先构建)。我不确定这对你来说是否是个问题,但鉴于你说你“无处不在”使用它们,甚至测量处理它们的非平凡处理时间,我认为它可能适用。

标签: c# .net optimization memory-management


【解决方案1】:

您可以使用Factory pattern 通过某些索引创建对象并返回缓存实例(假设您的对象是不可变的,否则返回共享副本会很危险)。

即遵循CultureInfo.GetCultureInfo 实现,该实现具有通过其中一个键返回实例的工厂方法。

public static CultureInfo GetCultureInfo(string name)

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

【讨论】:

    【解决方案2】:

    您想要做的是缓存。有几种方法可以实现它,但总体思路是建立一些结构来存储所有以前创建的局部变量,而不是创建一个新的结构,而是先搜索该集合。

    您的一个选择是创建一个Dictionary<string, Locale>。该字符串将是类似“en-US”的字符串。每次您想创建一个新的Locale 时,首先检查它是否在Dictionary 中。如果是,请退回它。如果没有,请实际制作一个新并将其放入Dictionary

    public static class LocaleFactory
    {
        private static Dictionary<string, Locale> cache = new Dictionary<string, Locale>();
    
        public static Locale GetLocal(string localeString)
        {
            Locale output;
            if (cache.TryGetValue(localeString, out output))
            {
                return output;
            }
            else
            {
                output = new Locale(localeString);
                //do other creation stuff for the Locale
                cache.Add(localeString, output);
                return output;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以有这样的东西:

      class Locale {
          static Locale en;
          static Locale de;
          ...
          static Locale getLocale(string local){
            //checking if the wanted local already exists and return it or instance it
          }
      };
      

      像单身但有点不同

      【讨论】:

        猜你喜欢
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        • 2016-06-17
        相关资源
        最近更新 更多