使用Elixir的简单,高效的FIFO队列

Jos*_*itt 11 elixir

是否有内置数据类型可用于Elixir中的FIFO队列?

我已经查看了列表,但似乎获得列表尾部效率不高?也许我对此错了?

我的队列需要容纳100,000或更多元素.我需要的是,我为音频生成{t,y}形式的44100个元组.我正在尝试实现延迟,所以我需要在将其发送到处理管道之前排队几秒钟(最多可能是10?)的音频.

ara*_*nku 20

我不确定100,000或更多元素的性能,但看起来你正在寻找Queue.它是Erlang/OTP提供的FIFO队列.

例:

iex(39)> queue = :queue.new                            
{[], []}
iex(40)> queue = :queue.in(1, queue)                   
{[1], []}
iex(41)> queue = :queue.in(2, queue)                   
{[2], [1]}
iex(42)> queue = :queue.in(3, queue)
{[3, 2], [1]}
iex(43)> :queue.out(queue)                             
{{:value, 1}, {[3], [2]}}
iex(44)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 1}, {[3], [2]}}
iex(45)> head
1
iex(46)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 2}, {[], [3]}}
iex(47)> head
2
iex(48)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 3}, {[], []}}
iex(49)> head
3
iex(51)> :queue.out(queue)        
{:empty, {[], []}}
Run Code Online (Sandbox Code Playgroud)

  • 由于Erlang代码经常用于软实时应用程序,因此要注意标准`queue`的*amortized*perf特性.例如,在100,000`in`调用之后,第一个`out`调用将是O(N)操作.但是剩下的99,999`out`来电将是O(1). (4认同)
  • 添加了@arcseldon (2认同)