0

我们有一个将 C# poco 对象加载到内存中的系统。(从磁盘上的数据源反序列化)。它们进一步缓存在 ObjectCache (MemoryCache.Default) 中,并通过 Repository 类公开。链条是这样的:

private Dictionary<string, T> itemsDictionary;
    private Dictionary<string, T> ItemsDictionary
    {
        get
        {
            return itemsDictionary ?? (itemsDictionary = RepositoryLoader.Load());        
        }
    }

    private List<T> itemsList;
    private List<T> ItemsList
    {
        get
        {
            return itemsList ?? (itemsList = ItemsDictionary.Values.ToList());
        }
    }

    public List<T> All { get { return ItemsList; } }

RepositoryLoader.Load() - 这会将内存缓存中的项目缓存为 Dictionary ...

我的问题是——正如你所看到的,它也通过 2 个缓存属性进行——它是否会造成内存消耗的重复?:) 有没有办法优化这条链?

4

1 回答 1

1

如果T是 a class,同时具有itemsDictionaryitemsList意味着您有两个对相同内存位置的引用。假设每个项目都很大,例如复杂的对象,这可以忽略不计(每个项目 4 或 8 个字节,取决于您运行的是 32 位还是 64 位)。但是,如果项目是structs,这意味着它们将被复制,并且您将使用双倍的内存。

如果内存使用是一个问题,并且您只需要ItemsList在某些时候,您可能想要删除该itemsList字段并让属性动态生成它:

return ItemsDictionary.Values.ToList();

另一个选项,假设您可以控制RepositoryLoader功能,是编写一个IDictionary<,>实现,将其公开Values,例如IReadOnlyList<T>直接,而不重新创建列表。

于 2013-10-17T13:48:45.283 回答