C# ListPool 缓存数据结构

可重复使用(缓存)结构

1.利用静态类&静态方法获取某个数据结构。

2.利用静态变量在所有类成员中公用的原理,达到使用时(分情况)获取,不使用时不释放而是缓存以便下次使用的目的。



适用环境

  1.该数据结构存储的数据为临时数据,短时间使用后会被释放。

  2.某一帧内多次重复使用同一数据结构。(例如for循环中,当然你用循环外临时变量也是ok的)

  3.某些特殊情况,比如多线程的频繁交互。

使用方式:

  1.通过静态方法获取数据结构

  2.用完还给静态方法(一定记住)



代码:

使用方式:
        private void Start()
        {
            List<PaintToolbarItem> list = ListPool<PaintToolbarItem>.Pop();

           // 使用

            ListPool<PaintToolbarItem>.Push(list);
        }        

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Game
{
    public class CSObjectPool<T> where T : class, new()
    {
        private Stack<T> m_ObjStack = new Stack<T>();
        private Action<T> m_OnPop;
        private Action<T> m_OnPush;

        public CSObjectPool(Action<T> onPop, Action<T> onPush)
        {
            m_OnPop = onPop;
            m_OnPush = onPush;
        }

        /// <summary>
        /// 取出
        /// </summary>
        public T Pop()
        {
            T obj = null;
            if(m_ObjStack.Count == 0)
            {
                obj = new T();
            }
            else
            {
                obj = m_ObjStack.Pop();
            }

            if(obj != null && m_OnPop != null)
            {
                m_OnPop(obj);
            }
            return obj;
        }

        /// <summary>
        /// 放回
        /// </summary>
        public void Push(T obj)
        {
            if(obj == null)
                return;

            if(m_ObjStack.Count > 0 && ReferenceEquals(m_ObjStack.Peek(), obj))
            {
                Debug.LogError(string.Format("CSObjectPool error. Trying to push object that is already in the pool, obj = {0}", obj));
                return;
            }

            if(m_OnPush != null)
            {
                m_OnPush(obj);
            }
            m_ObjStack.Push(obj);
        }
    }
}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Game
{
    public static class ListPool<T>
    {
        private static CSObjectPool<List<T>> m_Pools = new CSObjectPool<List<T>>(null, x => x.Clear());

        /// <summary>
        /// 取出
        /// </summary>
        public static List<T> Pop()
        {
            return m_Pools.Pop();
        }
        /// <summary>
        /// 放回
        /// </summary>
        public static void Push(List<T> list)
        {
            m_Pools.Push(list);
        }
    }

    public static class HashSetPool<T>
    {
        private static CSObjectPool<HashSet<T>> m_Pools = new CSObjectPool<HashSet<T>>(null, x => x.Clear());

        /// <summary>
        /// 取出
        /// </summary>
        public static HashSet<T> Pop()
        {
            return m_Pools.Pop();
        }
        /// <summary>
        /// 放回
        /// </summary>
        public static void Push(HashSet<T> hashSet)
        {
            m_Pools.Push(hashSet);
        }
    }

}

原文地址:https://www.cnblogs.com/jwv5/p/11387241.html

时间: 2024-10-29 22:04:58

C# ListPool 缓存数据结构的相关文章

ATS缓存数据结构

ATS缓存数据结构 HttpTunnel类 数据传输驱动器(data transfer driver),包含一个生产者(producer)集合,每个生产者连接到一个或是多个消费者(comsumer).隧道(tunnel)处理事件和缓冲区以便数据能从生产者移动到消费者,数据会尽可能保存在引用计数类型的缓冲区中.只有数据发生变动,或者在数据源(它从ATS外部获取数据)和数据接收端(它将数据发送到ATS外部)的情况下,才会发生拷贝操作. HTTPCacheAlt类 定义在HTTP.h中,它是一个缓存对

缓存框架Guava Cache部分源码分析

在本地缓存中,最常用的就是OSCache和谷歌的Guava Cache.其中OSCache在07年就停止维护了,但它仍然被广泛的使用.谷歌的Guava Cache也是一个非常优秀的本地缓存,使用起来非常灵活,功能也十分强大,可以说是当前本地缓存中最优秀的缓存框架之一.之前我们分析了OSCache的部分源码,本篇就通过Guava Cache的部分源码,来分析一下Guava Cache的实现原理. 在分析之前,先弄清数据结构的使用.之前的文章提到,OSCache使用了一个扩展的HashTable,作

缓存框架OSCache部分源码分析

在并发量比较大的场景,如果采用直接访问数据库的方式,将会对数据库带来巨大的压力,严重的情况下可能会导致数据库不可用状态,并且时间的消耗也是不能容忍的.在这种情况下,一般采用缓存的方式.将经常访问的热点数据提前加载到内存中,这样能够大大降低数据库的压力. OSCache是一个开源的缓存框架,虽然现在已经停止维护了,但是对于OSCache的实现还是值得学习和借鉴的.下面通过OSCache的部分源码分析OSCache的设计思想. 缓存数据结构 通常缓存都是通过<K,V>这种数据结构存储,但缓存都是应

那些年我们一起追过的缓存写法(转)

出处:http://www.codeceo.com/article/cache-01.html ------------------------------------------------------------------------------ 介绍 本篇主要说下楼主平常项目中缓存使用经验和遇到过的问题. 目录 一: 基本写法 二:缓存雪崩 1:全局锁,实例锁 2:字符串锁 三:缓存穿透 四:再谈缓存雪崩 五:总结 一:基本写法 为了方便演示,我们用Runtime.Cache做缓存容器,

mybatis0209 二级缓存

1.1二级缓存 1.1.1原理 mybatis和spring整合后一级缓存就没有了,sqlSession在不关闭的前提下2次查询就会从缓存中取,一级缓存缓存在sqlSession对象里面,当多用户查询的时候就用到二级缓存了.UserMapper缓存:会把根据id和根据name查询的用户信息写进缓存,如果有人发了insert语句则会把所有的用户信息清空,二级缓存是命名空间级别的. 二级缓存的范围是mapper级别(mapper同一个命名空间的缓存,在UserMapper.xml里面有一个命名空间<

那些年我们一起追过的缓存写法(三)

目录 一:分析设计 二:O(1)LRU实现 三:过期删除策略 四: 总结 一:分析设计 假设有个项目有一定并发量,要用到多级缓存,如下: 在实际设计一个内存缓存前,我们需要考虑的问题: 1:内存与Redis的数据置换,尽可能在内存中提高数据命中率,减少下一级的压力. 2:内存容量的限制,需要控制缓存数量. 3:热点数据更新不同,需要可配置单个key过期时间. 4:良好的缓存过期删除策略. 5:缓存数据结构的复杂度尽可能的低. 关于置换及命中率:我们采用LRU算法,因为它实现简单,缓存key命中率

Nginx缓存功能、防盗链、URL重写

nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从本地构造响应报文. nginx的缓存数据结构: 共享内存:存储键和缓存对象元数据 磁盘空间:存储数据 用法: Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number

Mybatis框架学习(四)—查询缓存与spring的整合开发

1       项目整体目录 2       查询缓存 2.1     缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2.1    mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mappe

缓存写法总结

基本写法 为了方便演示,这里使用Runtime.Cache做缓存容器,并定义个简单操作类.如下: 1 2 3 4 5 6 7 8 9 10 11 12 public class CacheHelper    {        public static object Get(string cacheKey)        {            return HttpRuntime.Cache[cacheKey];        }        public static void Add(