私のコードは基本的に割り当てが無料ですが、GCは60fpsで30秒ごとに実行されます。割り当てのためにDDMSを使ってアプリをチェックすると、SimpleListIterator
が割り当てられていることがわかります。私はExchanger
を使用しているので、割り当てられているものもあります。割り当て無料ゲーム
SimpleListIteratorは各ループfor (T obj : objs) {}
から来ます。私は、コンパイラ/トランスレータが、イテレータをサポートする型に対してイテレータを使用しないように最適化するという印象を受けましたが(私は基本的にArrayListのみを使用します)、それはそうではないようです。
これらをすべて割り当てるのを避けるにはどうすればいいですか?SimpleListIterators
?一つの解決策は、ループfor (int i = 0; i < size; ++i) {}
ために正規に切り替えることであろうが、私は、各ループ:(
別の方法として、一度だけ割り当てられIterator
を返すのArrayListを拡張するであろう。
私は一緒にハッキングされた第三の方法を好きIterator
を再利用しているCollection
を返す静的なヘルパー関数を使用している私は一緒にこのような何かをハッキングしたが、鋳造は非常にハックして危険な感じそれは私がThreadLocal
を使用するようかかわらず、スレッドセーフである必要があり、以下を参照してください:。。?
public class FastIterator {
private static ThreadLocal<Holder> holders = new ThreadLocal<Holder>();
public static <T> Iterable<T> get(ArrayList<T> list) {
Holder cont = holders.get();
if (cont == null) {
cont = new Holder();
cont.collection = new DummyCollection<T>();
cont.it = new Iterator<T>();
holders.set(cont);
}
Iterator<T> it = (Iterator<T>) cont.it;
DummyCollection<T> collection = (DummyCollection<T>) cont.collection;
it.setList(list);
collection.setIterator(it);
return collection;
}
private FastIterator() {}
private static class Holder {
public DummyCollection<?> collection;
public Iterator<?> it;
}
private static class DummyCollection<T> implements Iterable {
private Iterator<?> it;
@Override
public java.util.Iterator<T> iterator() {
return (java.util.Iterator<T>) it;
}
public void setIterator(Iterator<?> it) {
this.it = it;
}
}
private static class Iterator<T> implements java.util.Iterator<T> {
private ArrayList<T> list;
private int size;
private int i;
@Override
public boolean hasNext() {
return i < size;
}
@Override
public T next() {
return list.get(i++);
}
@Override
public void remove() {
}
public void setList(ArrayList<T> list) {
this.list = list;
size = list.size();
i = 0;
}
private Iterator() {}
}
}
を
ええ、あなたが正しく理解していれば、ハッキング反復子は、 'for'ループで値を取得するために必要な1行余分なものよりも優れていますか? –
Point taken。私はちょうど一緒に噛んで各ループの溝を取るべきだと思いますか? :( – alexanderblom
私は "一度だけ割り当てられた反復子を返すextends ArrayList"を使用しました。あなたが言及しているすべての反復スタイルで注意しなければならないことの一つはネストされた反復です。 releaseメソッドを使用して、イテレータがまだ使用されていないことを確認することができます...もう1つの注意:Iterator.removeにUnsupportedOperationExceptionをスローするのは合法です。 – Darrell