SORU
14 EYLÜL 2011, ÇARŞAMBA


Neden Android altında ek açıklamalar böyle bir performans sorunu (yavaş)?

Sınıfları Java ek açıklamaları kullandığı ORMLite baş yazarı veritabanı şemaları oluşturmak için geldim. Bizim paketi için büyük başlangıç performans sorunu Android 1.6 altında açıklama yöntemleri arama için çıkıyor. Aynı davranışı 3.0 ile görüyorum.

Aşağıdaki basit açıklama kodu olduğunu görüyoruzinanılmazGC yoğun ve gerçek performans ile ilgili bir sorun. Açıklama yöntemi için 1000 çağrıları hızlı bir kutusu neredeyse bir saniye sürüyor. Aynı kod benim Mac Pro üzerinde çalışan aynı zamanda 28 milyon (sic) aramaları yapabilir. 25 yöntemleri olan bir açıklama var ve bir saniye bu 50'den fazla yapmak istiyoruz.

Herkes bu neden oluyor ve eğer etrafında herhangi bir çalışma olup olmadığını biliyor mu? Kesinlikle ORMLite bu bilgileri önbelleğe açısından yapabilir ama orada "" ek açıklamalar Android altında? düzeltmek için yapabileceğimiz bir şey olduğunu şeyler vardır Teşekkürler.

public void testAndroidAnnotations() throws Exception {
    Field field = Foo.class.getDeclaredField("field");
    MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);
    long before = System.currentTimeMillis();
    for (int i = 0; i < 1000; i  )
        myAnnotation.foo();
    Log.i("test", "in "   (System.currentTimeMillis() - before)   "ms");
}
@Target(FIELD) @Retention(RUNTIME)
private static @interface MyAnnotation {
    String foo();
}
private static class Foo {
    @MyAnnotation(foo = "bar")
    String field;
}

Bu aşağıdaki günlük çıktısını verir:

I/TestRunner(  895): started: testAndroidAnnotations
D/dalvikvm(  895): GC freed 6567 objects / 476320 bytes in 85ms
D/dalvikvm(  895): GC freed 8951 objects / 599944 bytes in 71ms
D/dalvikvm(  895): GC freed 7721 objects / 524576 bytes in 68ms
D/dalvikvm(  895): GC freed 7709 objects / 523448 bytes in 73ms
I/test    (  895): in 854ms

DÜZENLEME:

@Candrews doğru yönde beni işaret etti sonra kodu ben biraz araştırdım. Performans sorunu Method.equals() Bazı korkunç, iğrenç kodu neden olmuş gibi görünüyor. Her iki yöntem toString() arama ve daha sonra bunları karşılaştırmak. toString() Her iyi başlatılıyor bir boyut olmadan ekleme yöntemleri bir sürü StringBuilder kullanın. Alanları karşılaştırarak .equals yapmak daha hızlı olacaktır.

DÜZENLEME:

Yansıma performansı ilginç bir gelişme bana verildi. Şimdi alanların listesini doğrudan okumak AnnotationFactory sınıf içinde peek yansıma kullanıyoruz. Bu yansıma sınıf 20 yaparkeredaha hızlı beri bizim için atlar method.equals() aramayı kullanarak çağırmak. Genel bir çözüm değil ama işte ORMLite SVN repository Java kod. Genel bir çözüm için, yanchenko's answer below bkz.

CEVAP
14 EYLÜL 2011, ÇARŞAMBA


Google sorunu kabul etti ve düzeltti "post-Petek"

https://code.google.com/p/android/issues/detail?id=7811

En azından onlar bunu biliyor ve güya gelecek sürüm için sabit.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fraser Raft

    Fraser Raft

    9 Mart 2010
  • Showtime

    Showtime

    21 HAZİRAN 2006
  • Tek Syndicate

    Tek Syndicat

    23 Temmuz 2008