Class IndexedRingBuffer<E>

  • Type Parameters:
    E -
    All Implemented Interfaces:
    Subscription


    public final class IndexedRingBuffer<E>
    extends Object
    implements Subscription
    Add/Remove without object allocation (after initial construction).

    This is meant for hundreds or single-digit thousands of elements that need to be rapidly added and randomly or sequentially removed while avoiding object allocation.

    On Intel Core i7, 2.3Mhz, Mac Java 8:

    - adds per second single-threaded => ~32,598,500 for 100 - adds per second single-threaded => ~23,200,000 for 10,000 - adds + removes per second single-threaded => 15,562,100 for 100 - adds + removes per second single-threaded => 8,760,000 for 10,000

      Benchmark (size) Mode Samples Score Score error Units r.i.IndexedRingBufferPerf.indexedRingBufferAdd 100 thrpt 5 263571.721 9856.994 ops/s r.i.IndexedRingBufferPerf.indexedRingBufferAdd 10000 thrpt 5 1763.417 211.998 ops/s r.i.IndexedRingBufferPerf.indexedRingBufferAddRemove 100 thrpt 5 139850.115 17143.705 ops/s r.i.IndexedRingBufferPerf.indexedRingBufferAddRemove 10000 thrpt 5 809.982 72.931 ops/s  
    • Method Detail

      • releaseToPool

        public void releaseToPool()
        This resets the arrays, nulls out references and returns it to the pool. This extra CPU cost is far smaller than the object allocation cost of not pooling.
      • unsubscribe

        public void unsubscribe()
        Description copied from interface: Subscription
        Stops the receipt of notifications on the Subscriber that was registered when this Subscription was received.

        This allows unregistering an Subscriber before it has finished receiving all events (i.e. before onCompleted is called).

      • add

        public int add(E e)
        Add an element and return the index where it was added to allow removal.
        Parameters:
        e -
        Returns:
      • remove

        public E remove(int index)
      • isUnsubscribed

        public boolean isUnsubscribed()
        Description copied from interface: Subscription
        Indicates whether this Subscription is currently unsubscribed.
        Specified by:
        isUnsubscribed in interface  Subscription
        Returns:
        true if this Subscription is currently unsubscribed, false otherwise
      • forEach

        public int forEach(Func1<? super E,Boolean> action,
                           int startIndex)
        Parameters:
        action - that processes each item and returns true if it wants to continue to the next
        Returns:
        int of next index to process, or last index seen if it exited early