sobota, 10 października 2015

Java - static block

Ciekawostka Java - niby prosta ale można się przejechać.
Pytanie co się wyświetli true czy false?
W sumie wydaje się że powinno być true bo jawnie utawiam C2.varStatic = true; Ale blok static z C2 się uruchamia wtedy kiedy jest ładowana klasa C2. W moim mniemaniu dostęp do zmiennej varStatic w C2 wymaga obecności klasy C2 bo ta zmienna należy do C2. Więc niestety sekcja static w C2 odpali się zanim cokolwiek ustawie... i w tym problem ze wyświetli się false

// file C2.java
public class C2 {
 public static boolean varStatic;
 static {
   System.out.println(varStatic);
 }
}

public class C1 {
 public static void main(String[] a) {
  C2.varStatic = true;
  C2 c2 = new C2(); 
 }
}


wtorek, 6 października 2015

Java template Engine

Już temat mocno wyświechtany.... ale przez własną ciekawość chciałem sprawdzić możliwości dodania nowego engine template do starego webowego framework-a.
Zależało mi na utrzymaniu starej funkcjonalności i jako opcję wykorzystanie nowej funkcjonalności oferowanej przez inne template engine.

Co ciekawe przy wykorzystaniu starego mechanizmu replace przy pomocy regexp lub indexof jest wcale niezła podstawowa wydajność template i w zasadzie tym się broni tylko to zabytkowe rozwiązanie - wydajnością.

Jakoś nie mogłem znaleźć obrazków do tego.
Na porównanie wybrałem sobie 2 łatwe do wdrożenia rozwiązania:

http://rythmengine.org/

http://freemarker.org/

W zakresie podstawowym sprawdzałem wydajność zastępowania template zawierającego 1 - n wystąpień tej samej zmiennej w szablonie w formacie odpowiednio dla engine <#var>, $var, ${var}, @var

Wydajność testowałem w 4 wątkach na procesorze i5. Odpowiednio w zestawieniu mam 1, 10, 100, 1000 wystąpień zmiennej


  • velocity1 - engine velocity (tu 1.4)
  • ksb - StringBuffer z replace przez regexp w formacie Velocity 
  • ktpl - template lokalnie rozwijane przy pomocy indexOf
  • rythm
  • freemarker
* Wydajność mierzona jako liczba konwersji na sekundę sumarycznie przez 4 równoległe wątki






Tak jak powiedziałem ze względu na ograniczoną funkcjonalność zależało mi na utrzymaniu wydajności podstawowej. Wygląda na to że regexp w podstawowym zakresie daje radę! Przewagę widać tylko przy małych template. Powyżej 10 szanse już się wyrównują, ale przy dużych template indexof wykorzystany w liniowym parsowaniu ktpl jest skuteczny.

Zaskakująco wolno wypadł freemarker

> Velocity
Warunki uproszczone
#if($plural)were#{else}was#end

http://velocity.apache.org/engine/devel/user-guide.html#conditionals