首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby中的环形缓冲区

Ruby中的环形缓冲区
EN

Code Review用户
提问于 2014-03-24 21:39:46
回答 1查看 1.5K关注 0票数 6

前几天,我读到了关于环形缓冲器的文章,我被它的简单而高效所吸引。

我已经在Ruby中实现了一个循环(循环)缓冲区,我只是想知道我是否可以改进它,以及如何正确地度量它的性能。

环形缓冲器:

代码语言:javascript
复制
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

速度测试:

代码语言:javascript
复制
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)
EN

回答 1

Code Review用户

发布于 2014-03-24 23:53:58

我不是红宝石,但只是从一般的角度来看,我试图从抽象的接口角度来看待数据结构。您的接口看起来像一个固定大小的FIFO队列。事实上,您将其实现为一个环形缓冲区,这只是一个实现细节。因此,我倾向于将其重命名为FixedSizeQueue,将write重命名为enqueue,并将其读给dequeue,因为您已经实现了这些操作,这似乎是比较自然的名称。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/45260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档