Inicjalizacja statyczna Guava Charmatcher jest powolna
UPDATE: Wygląda na to, że mój 13.0.1 wywołuje kod z tego diffed CharMatchera.
Wydaje mi się, że mam problem z Charmatcherem Guawy. Obecnie piszę niektóre testy JUnit i zauważam, że pierwszy test zajmuje trochę czasu (15+ sekund), ale wszystkie przyszłe testy są w przybliżeniu takie same (0,3 sekundy), przy czym większość testów przechodzi przez to samo kod.
Moja analiza kodu wskazała, że winowajcą jest biblioteka Charmatcher w bibliotece Guava. Wygląda na to, że w CharMatcherze jest trochę statycznego kodu inicjującego, który może być prawdziwym powodem, dla którego trwa tak długo. Czy w jakiś sposób mogę wyłączyć lub zoptymalizować to zachowanie? Czy jest coś, czego brakuje mi na stronach wiki lub plikach pomocy?
Guava wersja 13.0.1, System: Linux 64, Eclipse 3.6.1
EDYCJA: Zbudowałem aplikację testową z następującym kodem:
import com.google.common.base.CharMatcher;
public class Main {
public static void main(String[] args) {
// Using system instead of stopwatch to isolate library.
long startTime = System.currentTimeMillis();
CharMatcher.is(' ');
long endTime = System.currentTimeMillis();
System.out.println("took " + String.valueOf(endTime-startTime) + " ms");
startTime = System.currentTimeMillis();
CharMatcher.is('d');
endTime = System.currentTimeMillis();
System.out.println("2nd took " + String.valueOf(endTime-startTime) + " ms");
}
}
Spowodowało to następujące wyniki:
took 15945 ms
2nd took 0 ms
Uruchomiłem to w eclipse minus struktura JUnit i tylko biblioteka guava w google. Również spakowałem plik wykonywalny i otrzymałem podobne wyniki. Wrócę z drugą edycją po uruchomieniu przez niego profilera.
Dzięki za pomoc.
Edytuj 2: Wyniki profilowania:
Main.main(String[]) 22,556 ms
com.google.common.base.CharMatcher.<clinit>() 22.556 ms
com.google.common.base.CharMatcher.precomputed() 22,550 ms
com.google.common.base.Platform.precomputeCharMatcher(CharMatcher) 22,550 ms
com.google.common.base.CharMatcher.precomputedInternal() 22,550 ms
com.google.common.base.CharMatcher.slowGetChars() 13,638 ms
com.google.common.base.CharMatcher.setBits(CharMatcher$LookupTable) 8,911 ms