I think we can do better with mutable.Queue:

    scala> th.pbenchOff() { val b = mutable.ArrayBuffer[AnyRef](); (0 to 10000).foreach { b += _.toString } } { val b = mutable.Queue[AnyRef](); (0 to 10000).foreach { b enqueue  _.toString } }
    Benchmark comparison (in 13.35 s)
    Significantly different (p ~= 0)
      Time ratio:    2.36624   95% CI 2.34000 - 2.39249   (n=20)
        First     351.2 us   95% CI 349.2 us - 353.2 us
        Second    831.0 us   95% CI 823.0 us - 838.9 us


    scala> val ab = mutable.ArrayBuffer[AnyRef](); (0 to 10000).foreach { ab += _.toString }
    scala> val q = mutable.Queue[AnyRef](); (0 to 10000).foreach { i=> q.enqueue(i.toString) }
    scala> th.pbenchOff() { var b = ab; while (b.nonEmpty) b = b.drop(5) } { while (q.nonEmpty) { q.head; q.dequeue }}
    Benchmark comparison (in 49.05 s)
    Significantly different (p ~= 0)
      Time ratio:    0.00000   95% CI 0.00000 - 0.00000   (n=20)
        First     337.1 ms   95% CI 336.2 ms - 338.1 ms
        Second    3.072 ns   95% CI 3.015 ns - 3.129 ns
      Individual benchmarks not fully consistent with head-to-head (p ~= 1.116e-04)
        First     338.2 ms   95% CI 331.6 ms - 344.9 ms
        Second    2.442 ns   95% CI 2.366 ns - 2.519 ns

Tried with java.util.LinkedList also, but that is same as mutable.Queue