zoukankan      html  css  js  c++  java
  • C# 固定大小的缓存

    有时候需要把最新的N条记录暂时存起来供需要的时候调用,C#有没有指针,怎么办呢咱利用数组和byte字节整一个类:

        public class Buffer<T>
        {
            private T[] _TS;
            private byte _Index = 0;
            private int _Capcity;
            public Buffer(int capcity)
            {
                //将数组的大小设置成2的n次方
                while ((capcity & capcity - 1) != 0)
                    capcity++;
                _TS = new T[capcity];
                _Capcity = capcity;
            }
            public void Write(T t)
            {
                _TS[_Index % _Capcity] = t;
                _Index++;
            }
    
            public IEnumerable<T> Read()
            {
                byte index = _Index;
                for (int i = 0; i < _TS.Count(); i++)
                {
                    index--;
                    yield return _TS[index % _Capcity];
                }
            }
        }

     解释一下:

    1.byte _Index=0;

    _Index--; //=0xff

    _Index++;//=0

    利用byte的这个特点,写的时候++,读的时候--,不用考虑边界,是不是比较方便。

    2.数组大小为什么要自动调整为2的n次方?

    那是因为只有2的n次方的时候,(0xFF % _Capcity)==_Capcity-1,才能实现数组的遍历。

    测试一下,调用的代码如下:

            static void Main(string[] args)
            {
                Buffer<int> buffer = new Buffer<int>(10);
                var taskWrite = Task.Factory.StartNew(() =>
                {
    
                    for (int i = 0; i < 20; i++)
                    {
                        buffer.Write(i);
                        Console.WriteLine($"Write:i={i}");
                        Task.Delay(300).Wait();
                    }
                });
                var taskRead = Task.Factory.StartNew(() =>
                {
                    for (int i = 0; i < 7; i++)
                    {
                        Console.WriteLine("Read:" + string.Join(",", buffer.Read()));
                        Task.Delay(1000).Wait();
                    }
                });
                Task.WaitAll(taskWrite, taskRead);
            }
        }

    结果:

    适用于:

    1.小缓存,<=255

    当然可以>255,只要把_Index的类型改为uint16,uint32或者uint64,那大小分别是0xFFFF,0xFFFFFFFF和0xFFFFFFFFFFFFFFFF,但是这么大有用吗?还叫缓存吗?

    2.单线程读单线程写操作

  • 相关阅读:
    一周好文(15)
    一周好文(13)
    宏定义中的 "#" 和 "##"
    一周好文(14)
    CCRenderTexture崩溃问题分析
    C++反射机制的实现(转)
    一周好文(16)
    opengl on mac
    uthash: a hash table for C strcutures
    CC3LineNode线条变色的问题
  • 原文地址:https://www.cnblogs.com/catzhou/p/9011527.html
Copyright © 2011-2022 走看看