前几天,我读到了关于环形缓冲器的文章,我被它的简单而高效所吸引。
我已经在Ruby中实现了一个循环(循环)缓冲区,我只是想知道我是否可以改进它,以及如何正确地度量它的性能。
环形缓冲器:
class RingBuffer
attr_accessor :ring, :size, :start, :end
def initialize(size)
@ring = Array.new(size)
@size = size
@start, @end = 0, 0
end
def full?
(@end + 1) % @size == @start
end
def empty?
@end == @start
end
def write(element)
return if full?
@ring[@end] = element
@end = (@end + 1) % @size
end
def read
return if empty?
element = @ring[@start]
@start = (@start + 1) % @size
element
end
def clear
@ring = Array.new(@size)
@start, @end = 0, 0
end
end速度测试:
require_relative 'ring_buffer.rb'
buffer_size = 1024*1024
rb = RingBuffer.new(buffer_size)
t0 = Time.now
(buffer_size-1).times {|idx|
rb.write idx
}
t1 = Time.now
(buffer_size-1).times {|idx|
rb.read
}
t2 = Time.now
t_all = (t2-t0) * 1000.0
t_avg_w = (t1 - t0) * 1000.0 * 1000.0 / buffer_size
t_avg_r = (t2 - t1) * 1000.0 * 1000.0 / buffer_size
printf("All: %.02fms\n", t_all)
printf("Avg. write: %.02fμs\n", t_avg_w)
printf("Avg. read: %.02fμs\n", t_avg_r)发布于 2014-03-24 23:53:58
我不是红宝石,但只是从一般的角度来看,我试图从抽象的接口角度来看待数据结构。您的接口看起来像一个固定大小的FIFO队列。事实上,您将其实现为一个环形缓冲区,这只是一个实现细节。因此,我倾向于将其重命名为FixedSizeQueue,将write重命名为enqueue,并将其读给dequeue,因为您已经实现了这些操作,这似乎是比较自然的名称。
https://codereview.stackexchange.com/questions/45260
复制相似问题