We have an efficient implementation for you: use the Pools.java file
from 
http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=core/java/android/util;h=728ff2a95d2b382c4a16a28cc9766d29bc84e1b3;hb=master
(and the associated classes.) These are not public APIs so just copy
the code in your application.

Here's an example of a Poolable object with this API:
        static class InvalidateInfo implements Poolable<InvalidateInfo> {
            private static final int POOL_LIMIT = 10;
            private static final Pool<InvalidateInfo> sPool =
Pools.synchronizedPool(
                    Pools.finitePool(new PoolableManager<InvalidateInfo>() {
                        public InvalidateInfo newInstance() {
                            return new InvalidateInfo();
                        }

                        public void onAcquired(InvalidateInfo element) {
                        }

                        public void onReleased(InvalidateInfo element) {
                        }
                    }, POOL_LIMIT)
            );

            private InvalidateInfo mNext;

            public void setNextPoolable(InvalidateInfo element) {
                mNext = element;
            }

            public InvalidateInfo getNextPoolable() {
                return mNext;
            }

            static InvalidateInfo acquire() {
                return sPool.acquire();
            }

            void release() {
                sPool.release(this);
            }
        }

On Wed, Jul 15, 2009 at 1:48 PM, Brad Larson<bklar...@gmail.com> wrote:
>
> At Google I/O and in the forums, it has been clear that if you need
> optimal performance, you must avoid memory allocation inside tight
> loops.  I'm curious about the best way to handle this in my use-case,
> which I think must be fairly common.  I need to access at most n
> objects of type MyObject, I need to iterate over them during every
> screen refresh,  and I need to remove them and put them back in the
> object pool randomly.
>
> The object pool seems pretty straight-forward, just use a
> Vector<MyObject>(n), add n copies of MyObject at bootup, and add/
> remove from the end to avoid any memcpy or allocation.
>
> The iterating is a little more difficult.  I can use for(MyObject m :
> myObjects), but this will allocate memory to create the iterator.  I
> could create a static final Iterator at bootup, but there is no good
> way to get back to the start of the List.  For now, I'm using another
> Vector for active MyObjects, and a for loop with an int to get() the
> objects and avoid allocating an iterator.  get() runs in constant time
> for a Vector, so this works well.
>
> However, when an object is done, I need to remove it and send it back
> to the pool.  If I use Vector.remove(i), it has to memcpy everything
> after i.  I could use an Iterator on a LinkedList, which can remove()
> in constant time, but I don't think there is a good way to get the
> Iterator back to the start of the list without allocating memory.  I
> could use an int to loop through a LinkedList, but LinkedList.get(n)
> runs in O(n) time.
>
> Any tips on the optimal way to solve this?  Worst-case, I assume the
> memcpy called during Vector.remove() is a better bet over allocating
> an Iterator inside my app loop, correct?
>
> Thanks!
> Brad
> >
>



-- 
Romain Guy
Android framework engineer
romain...@android.com

Note: please don't send private questions to me, as I don't have time
to provide private support.  All such questions should be posted on
public forums, where I and others can see and answer them

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to