2013-03-17 16 views
6

için hesap veremediğim süreyi gerektiriyor. JProfiler'i kullanarak, Java kodumda anlam ifade edemediğim bir sıcak nokta tespit ettim. JProfiler, bu yöntemin, ayıklama yöntemlerini çağırmak için gereken süreyi içermeyen, ortalama olarak ortalama 150 μ s (674 μ s ısınma olmadan) aldığını açıklar. 150 μ s pek görünmeyebilir, ama bu uygulamada (ve benim kullanıcılar tarafından deneyimlidir) ve bu bana göre daha karmaşık görünüyor diğer yöntemlere göre çok daha fazla gibi görünüyor. Bu yüzden benim için önemli.Java yöntemi,

private boolean assertReadAuthorizationForFields(Object entity, Object[] state, 
     String[] propertyNames) { 
    boolean changed = false; 
    final List<Field> fields = FieldUtil.getAppropriatePropertyFields(entity, propertyNames); 
    // average of 14 fields to iterate over 
    for (final Field field : fields) { 
     // manager.getAuthorization returns an enum type 
     // manager is a field referencing another component 
     if (manager.getAuthorization(READ, field).isDenied()) { 
      FieldUtil.resetField(field.getName(), state, propertyNames); 
      changed = true; 
     } 
    } 
    return changed; 
} 

Bu yöntemi farklı yönlerde en aza indirdim, ancak bana hiçbir zaman yararlı olmadığını öğretir. JProfiler tarafından bildirilen sürenin (150 μ s) yalnızca bu yöntemdeki kodla ilgili olduğunu ve getAuthorization, isDenied, resetField ve benzeri işlemleri yürütmek için gereken süreyi içermediğini vurgulayamıyorum. Bu yüzden, bu kod parçacığını çok bağlamsız yayınlamakla başladım, çünkü sorun, bu kodla birlikte göründüğü ve sonraki müteakip yöntem çağrıları değil.

Belki neden hayalet görüyorum hissediyorsun – iddia edebilirsiniz :) Her neyse, zaman ayırdığınız için teşekkürler!

+1

Profil, bir ısınma süresi gerektirir (JIT için). Isınıyor musun? JIT devre dışı mı? – Java42

+0

Bu iyi bir nokta. Bunu bilmeme rağmen, topu oraya bırakmış olabilirim. Gönderiyi güncelleyeceğim ve bazı ısınma turlarından sonra aldığım sürenin miktarı ile birlikte, hala aşırı olduğu fikrine alıp alamayacağımı ikiye ayırıyorum ... belki de soruyu silmem gerekir ... belki değil :) –

+2

JProfiler ile CPU örnekleme veya dinamik enstrüman kullanıyor musunuz? –

cevap

0

Profiler her zaman doğru zamanlama vermediğinden, size zaman ayırmanızı öneririz.

Sadece bu kodla bir mikro ölçüt oluşturun ve en az 2 saniye süreyle bekleyin. Yöntem çağrılarının ne kadar fark yaratacağını öğrenmek için, geri döndükleri değerleri ve kodları yorumlayın. sizi yavaşlatır olabilir

+1

Örnekleme profilleyicileri tarafından bildirilen zaman zaman yanlış zamanlamaların iki nedeni: 1) JIT, yöntem, bu yöntem asla bağımsız olarak rapor edilmeyecektir. Aranan yöntemler de bağımsız olarak raporlanıyor mu (ısınmadan sonra bile)? Değilse, bunlar satır içi olabilir, bu durumda zamanlarının doğru bir şekilde assertReadAuthorizationForFields() öğesine atfedileceği belirtilir. 2) Örneklemeden önce istikrarlı bir zaman bildirmek oldukça uzun bir süre alabilir. JProfiler'den gördüğünüz zamanlar 1 koşudan diğerine kararlı mı? – AaronD

1

Aday davranışı:

  • Başlıca etkisi: Açıkçası yineleme. Eğer çok fazla alanınız varsa ... Ortalama 14, ortada oldukça anlamlı olan
  • Büyük etki: hotspot satırlaması, çağrılan yöntemlerin zamanınıza dahil edilmesi anlamına gelir ve bu yöntem çağrı (lar) ınızın kullanımı nedeniyle fark edilebilir. yansıması. getAppropriatePropertySınıf alanı tanımı meta verileriyle ilgili içgörüler; resetField, dinamik olarak setter yöntemlerini (muhtemelen Method.invoke() ??) kullanarak çağırır. Performans için çaresiz iseniz, bir HashSet kullanarak bir önbellek kullanabilirsiniz (haritalama ElementClass-> FieldMetadataAndMethodHandle) Bu, alan meta verileri ve setter yöntemlerinin MethodHandles'ı içerebilir (method.invoke, yavaş olanı yerine). Sonra sadece uygulama başlangıcı sırasında yansıtacak ve JVM'nin hızlı dynamicInvoke desteğini kullanacaktınız.
  • Küçük etki - ancak yineleme sayısıyla çarpılır: durum ve özellik adları için çok büyük dizileriniz varsa ve ilkel alanları kullanırlarsa, o zaman yöntem çağırmaları sırasında bir miktar kopyalama işlemi yaparlar (yöntem parametreleri iletilir) değer 'gerçekten de başvuru-gönderme/kopyalama-ilkel-anlamlar demektir'
0

Bence bu konu FieldUtil'in Yansıma kullanıyor ve kullandığı alanları önbelleğe almıyor.

İlgili konular