RingBuffer从字面上来说,同样是一个数组,但是不仅仅只是一个简单的数组,其在数组的基础上,做了相当之多的优化,提高了大量性能
首先说下程序的局部性原理,局部性原理指的是一段时间内程序的执行会限定在一个局部范围内,
分为时间局部性和空间局部性
1.时间局部性
时间局部性是程序的某一条指令被执行了,说明可能在接下来一段时间内再次被执行
2.空间局部性
空间局部性则类似,说明了如果一块内存被访问了,不久后这条数据可能被访问,所以就会在某块空间被访问了,不久后这块内存附近的内存也会一并访问了
Cpu的缓冲就是利用了空间局部性的原理,在加载某个数据X的时候,同时会缓冲X附近的数据,更好的利用了CPU的缓冲功能
而RingBuffer的性能就在于利用了程序的空间局限性,在基本的数组加载的时候,空间上可能是不连续的,而RingBuffer则是内存地址连续的,在数组初始化的时候一次性创建保证连续性
for (int i=0; i<bufferSize; i++){
//entries[]就是RingBuffer内部的数组 //eventFactory就是前面示例代码中传入的LongEvent::new entries[BUFFER_PAD + i] = eventFactory.newInstance(); } |
上面就是加载后的RingBuffer的图例,将数据在内存空间上是连续的,提高性能,这样当线程消费的时候,利用了缓存的机制,整体提高了性能
而且RingBuffer是一个环,首尾相接,这个环具有一个序号,每个序号指向下一个可用的元素,不停的填充这个buffer,序号会一直增,到了绕环一周,多余的可以采用除留余数的方式获取位置,环的大小最好在2的次方上
没有尾部指针,只维护了一个指向下一个可用位置的序号,
其性能的优势在于,是一个数组,比链表更快,而且可以预测的访问模式,采用了缓存加载的方式
更不需要担心垃圾回收机制